更改 window/frame gtk3 pygtk 并传递参数
change window/frame gtk3 pygtk and pass parameters
我用 pygtk 创建了一个简单的游戏,它从开始页面(选项、新游戏、ecc)开始,当我按下新游戏按钮时,我想更改 window/frame 并替换为游戏 window .
这是一个代码示例:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Title of Window")
self.set_border_width(20)
layout = Gtk.Box(spacing=10)
self.add(layout)
self.set_default_size(300, 500)
label_start = Gtk.Label("This is start page")
layout.pack_start(label_start, True, True, 0)
new_game_button = Gtk.Button("NEW GAME")
new_game_button.connect("clicked", self.start_new_game)
new_game_button.set_border_width(20)
new_game_button.set_valign(Gtk.Align.CENTER)
layout.pack_start(new_game_button, True, True, 0)
def start_new_game(self, widget):
# here is were i want to go to first page
pass
class FirstPage(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Title of Window")
self.set_border_width(20)
layout = Gtk.Box(spacing=10)
self.add(layout)
self.set_default_size(300, 500)
label_start = Gtk.Label("This is start page")
layout.pack_start(label_start, True, True, 0)
return_button = Gtk.Button("NEW GAME")
return_button.connect("clicked", self.return_start_page)
return_button.set_border_width(20)
return_button.set_valign(Gtk.Align.CENTER)
layout.pack_start(return_button, True, True, 0)
def return_start_page(self, widget):
# here is were i want to manage the event to return to start page
pass
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
"start new game" 和 "return start page" 是我想要管理此事件的方法。
我还需要将其他参数传递给新游戏。
我可以简单地将它们添加到游戏 window 的 init 吗?
PS:"game window" 是示例中的 MainWindow,FirstPage 代表我的 "start page",带有选项菜单和其他东西。
解决方案
你应该只创建一个 Main window 和一个 Gtk.Box(作为容器),2 个 "screens" 应该是 2 个额外的Gtk.Box在集装箱箱子里。例如:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
super(MainWindow, self).__init__(title="Title of Window")
self.set_border_width(20)
self.set_default_size(300, 500)
container = Gtk.Box()
self.add(container)
container.show()
self.main = Main(self)
container.add(self.main)
self.first_page = FirstPage(self)
container.add(self.first_page)
class Main(Gtk.Box):
def __init__(self, parent_window):
super().__init__(spacing=10)
self.__parent_window = parent_window
label_start = Gtk.Label("This is start page")
self.pack_start(label_start, True, True, 0)
new_game_button = Gtk.Button("NEW GAME")
new_game_button.connect("clicked", self.start_new_game)
new_game_button.set_border_width(20)
new_game_button.set_valign(Gtk.Align.CENTER)
self.pack_start(new_game_button, True, True, 0)
def start_new_game(self, *args):
self.__parent_window.first_page.show_all()
self.hide()
class FirstPage(Gtk.Box):
def __init__(self, parent_window):
super().__init__(spacing=10)
self.__parent_window = parent_window
label_start = Gtk.Label("This is second page")
self.pack_start(label_start, True, True, 0)
return_button = Gtk.Button("END GAME")
return_button.connect("clicked", self.return_start_page)
return_button.set_border_width(20)
return_button.set_valign(Gtk.Align.CENTER)
self.pack_start(return_button, True, True, 0)
def return_start_page(self, *args):
self.__parent_window.main.show_all()
self.hide()
if __name__ == '__main__':
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.main.start_new_game()
window.show()
Gtk.main()
备选方案
您可以使用 Gtk.Notebook 和切换标签。例如:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
super(MainWindow, self).__init__(title="Title of Window")
self.set_border_width(20)
self.set_default_size(300, 500)
container = Gtk.Notebook()
container.set_show_tabs(False)
self.add(container)
main = Main(container)
container.append_page(main)
first_page = FirstPage(container)
container.append_page(first_page)
class Main(Gtk.Box):
def __init__(self, parent):
super().__init__(spacing=10)
self.__parent = parent
label_start = Gtk.Label("This is start page")
self.pack_start(label_start, True, True, 0)
new_game_button = Gtk.Button("NEW GAME")
new_game_button.connect("clicked", self.start_new_game)
new_game_button.set_border_width(20)
new_game_button.set_valign(Gtk.Align.CENTER)
self.pack_start(new_game_button, True, True, 0)
def start_new_game(self, widget):
self.__parent.set_current_page(1)
class FirstPage(Gtk.Box):
def __init__(self, parent):
super().__init__(spacing=10)
self.__parent = parent
label_start = Gtk.Label("This is second page")
self.pack_start(label_start, True, True, 0)
return_button = Gtk.Button("END GAME")
return_button.connect("clicked", self.return_start_page)
return_button.set_border_width(20)
return_button.set_valign(Gtk.Align.CENTER)
self.pack_start(return_button, True, True, 0)
def return_start_page(self, widget):
self.__parent.set_current_page(0)
if __name__ == '__main__':
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
我用 pygtk 创建了一个简单的游戏,它从开始页面(选项、新游戏、ecc)开始,当我按下新游戏按钮时,我想更改 window/frame 并替换为游戏 window . 这是一个代码示例:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Title of Window")
self.set_border_width(20)
layout = Gtk.Box(spacing=10)
self.add(layout)
self.set_default_size(300, 500)
label_start = Gtk.Label("This is start page")
layout.pack_start(label_start, True, True, 0)
new_game_button = Gtk.Button("NEW GAME")
new_game_button.connect("clicked", self.start_new_game)
new_game_button.set_border_width(20)
new_game_button.set_valign(Gtk.Align.CENTER)
layout.pack_start(new_game_button, True, True, 0)
def start_new_game(self, widget):
# here is were i want to go to first page
pass
class FirstPage(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Title of Window")
self.set_border_width(20)
layout = Gtk.Box(spacing=10)
self.add(layout)
self.set_default_size(300, 500)
label_start = Gtk.Label("This is start page")
layout.pack_start(label_start, True, True, 0)
return_button = Gtk.Button("NEW GAME")
return_button.connect("clicked", self.return_start_page)
return_button.set_border_width(20)
return_button.set_valign(Gtk.Align.CENTER)
layout.pack_start(return_button, True, True, 0)
def return_start_page(self, widget):
# here is were i want to manage the event to return to start page
pass
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
"start new game" 和 "return start page" 是我想要管理此事件的方法。 我还需要将其他参数传递给新游戏。 我可以简单地将它们添加到游戏 window 的 init 吗? PS:"game window" 是示例中的 MainWindow,FirstPage 代表我的 "start page",带有选项菜单和其他东西。
解决方案
你应该只创建一个 Main window 和一个 Gtk.Box(作为容器),2 个 "screens" 应该是 2 个额外的Gtk.Box在集装箱箱子里。例如:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
super(MainWindow, self).__init__(title="Title of Window")
self.set_border_width(20)
self.set_default_size(300, 500)
container = Gtk.Box()
self.add(container)
container.show()
self.main = Main(self)
container.add(self.main)
self.first_page = FirstPage(self)
container.add(self.first_page)
class Main(Gtk.Box):
def __init__(self, parent_window):
super().__init__(spacing=10)
self.__parent_window = parent_window
label_start = Gtk.Label("This is start page")
self.pack_start(label_start, True, True, 0)
new_game_button = Gtk.Button("NEW GAME")
new_game_button.connect("clicked", self.start_new_game)
new_game_button.set_border_width(20)
new_game_button.set_valign(Gtk.Align.CENTER)
self.pack_start(new_game_button, True, True, 0)
def start_new_game(self, *args):
self.__parent_window.first_page.show_all()
self.hide()
class FirstPage(Gtk.Box):
def __init__(self, parent_window):
super().__init__(spacing=10)
self.__parent_window = parent_window
label_start = Gtk.Label("This is second page")
self.pack_start(label_start, True, True, 0)
return_button = Gtk.Button("END GAME")
return_button.connect("clicked", self.return_start_page)
return_button.set_border_width(20)
return_button.set_valign(Gtk.Align.CENTER)
self.pack_start(return_button, True, True, 0)
def return_start_page(self, *args):
self.__parent_window.main.show_all()
self.hide()
if __name__ == '__main__':
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.main.start_new_game()
window.show()
Gtk.main()
备选方案
您可以使用 Gtk.Notebook 和切换标签。例如:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
super(MainWindow, self).__init__(title="Title of Window")
self.set_border_width(20)
self.set_default_size(300, 500)
container = Gtk.Notebook()
container.set_show_tabs(False)
self.add(container)
main = Main(container)
container.append_page(main)
first_page = FirstPage(container)
container.append_page(first_page)
class Main(Gtk.Box):
def __init__(self, parent):
super().__init__(spacing=10)
self.__parent = parent
label_start = Gtk.Label("This is start page")
self.pack_start(label_start, True, True, 0)
new_game_button = Gtk.Button("NEW GAME")
new_game_button.connect("clicked", self.start_new_game)
new_game_button.set_border_width(20)
new_game_button.set_valign(Gtk.Align.CENTER)
self.pack_start(new_game_button, True, True, 0)
def start_new_game(self, widget):
self.__parent.set_current_page(1)
class FirstPage(Gtk.Box):
def __init__(self, parent):
super().__init__(spacing=10)
self.__parent = parent
label_start = Gtk.Label("This is second page")
self.pack_start(label_start, True, True, 0)
return_button = Gtk.Button("END GAME")
return_button.connect("clicked", self.return_start_page)
return_button.set_border_width(20)
return_button.set_valign(Gtk.Align.CENTER)
self.pack_start(return_button, True, True, 0)
def return_start_page(self, widget):
self.__parent.set_current_page(0)
if __name__ == '__main__':
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()