1
+ import gi
2
+ gi .require_version ("Gtk" , "3.0" ) # GUI toolkit
3
+ gi .require_version ("WebKit2" , "4.0" ) # Web content engine
4
+ from gi .repository import Gtk , WebKit2
5
+
6
+ #main class
7
+ class Window ():
8
+
9
+ def __init__ (self , * args , ** kwargs ):
10
+ # create window
11
+ self .main_window = Gtk .Window (title = "My Browser" )
12
+ self .main_window .set_icon_from_file ('images/icon.png' ) # set icon image file
13
+ self .main_window .connect ('destroy' , Gtk .main_quit ) # connect the "destroy" trigger to Gtk.main_quit procedure
14
+ self .main_window .set_default_size (600 , 600 ) # set window size
15
+
16
+ # create navigation bar
17
+ self .navigation_bar = Gtk .HBox () # horizontal box navigation bar
18
+
19
+ # create UI elements for navigation bar
20
+ self .button_back = Gtk .ToolButton (Gtk .STOCK_GO_BACK ) # back button widget
21
+ self .button_forward = Gtk .ToolButton (Gtk .STOCK_GO_FORWARD ) # forward button widget
22
+ self .button_refresh = Gtk .ToolButton (Gtk .STOCK_REFRESH ) # refresh button widget
23
+ self .main_address_bar = Gtk .Entry () # address bar entry widget
24
+
25
+ # connect triggers for UI elements with respective procedures
26
+ self .button_back .connect ('clicked' , self .go_back ) # trigger:click
27
+ self .button_forward .connect ('clicked' , self .go_forward ) # trigger:click
28
+ self .button_refresh .connect ('clicked' , self .refresh_page ) # trigger:click
29
+ self .main_address_bar .connect ('activate' , self .load_page ) # trigger:enter
30
+
31
+ # attach UI elements to navigation bar
32
+ self .navigation_bar .pack_start (self .button_back , False , False , 0 )
33
+ self .navigation_bar .pack_start (self .button_forward , False , False , 0 )
34
+ self .navigation_bar .pack_start (self .button_refresh , False , False , 0 )
35
+ self .navigation_bar .pack_start (self .main_address_bar , True , True , 0 )
36
+
37
+ # Create view for webpage
38
+ self .web_view = WebKit2 .WebView () # initialize webview
39
+ self .web_view .load_uri ('https://google.com' ) # default homepage
40
+ self .web_view .connect ('notify::title' , self .change_title ) # trigger: title change
41
+ self .web_view .connect ('notify::estimated-load-progress' , self .change_url ) # trigger: webpage is loading
42
+ self .scrolled_window = Gtk .ScrolledWindow () # scrolling window widget
43
+ self .scrolled_window .add (self .web_view )
44
+
45
+ # Add everything and initialize
46
+ self .vbox_container = Gtk .VBox () # vertical box container
47
+ self .vbox_container .pack_start (self .navigation_bar , False , False , 0 )
48
+ self .vbox_container .pack_start (self .scrolled_window , True , True , 0 )
49
+
50
+ self .main_window .add (self .vbox_container )
51
+ self .main_window .show_all ()
52
+ Gtk .main ()
53
+
54
+ def load_page (self , widget ):
55
+ url = self .main_address_bar .get_text ()
56
+ if url .startswith ("http://" ) or url .startswith ("https://" ):
57
+ self .web_view .load_uri (url )
58
+ else :
59
+ url = "https://" + url
60
+ self .main_address_bar .set_text (url )
61
+ self .web_view .load_uri (url )
62
+
63
+ def change_title (self , widget , frame ):
64
+ self .main_window .set_title ("Simple Browser - " + self .web_view .get_title ())
65
+
66
+ def change_url (self , widget , frame ):
67
+ uri = self .web_view .get_uri ()
68
+ self .main_address_bar .set_text (uri )
69
+
70
+ def go_back (self , widget ):
71
+ self .web_view .go_back ()
72
+
73
+ def go_forward (self , widget ):
74
+ self .web_view .go_forward ()
75
+
76
+ def refresh_page (self , widget ):
77
+ self .web_view .reload ()
78
+
79
+ main = Window ()
0 commit comments