在 Toga (Beeware) 中替换 Window 的最佳方法
Best way to replace Window in Toga (Beeware)
我目前正在尝试使用 Toga 创建带有 Beeware 的跨平台应用程序。
我知道如何更新 window 中的内容(我只是清空框中的所有内容并向其中添加新内容)。
但是现在我遇到了问题,我想添加需要分配给变量的条目字段,以便我可以获得它们的值(而且我的第一个 window 的 class 已经非常大了。 .. 所以我也不想添加新的属性和方法)。所以我的目的是在我的另一个 class 之外创建一个新的 class,它显示我的新 window 并关闭旧的(或者只是替换我的旧的)
E. g.:
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class FirstWindow(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN))
main_box.add(toga.Button('Open window 2', on_press=self.open_new_window))
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
def open_new_window(self, widget):
# This should close the current Window and display the other window
# return SecodnWindow() doesn't work
# close() and exit() doesn't work too, cause I can't execute code after this
# statements anymore
class SecondWindow(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN))
#adding all the stuff to the window
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
# Other code
def main():
return FirstWindow()
谢谢^^
我找到了解决方案:
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class MultiWindow(toga.App):
def startup(self):
main_box = toga.Box()
main_box.add(toga.Button('Open Window', on_press=self.show_second_window))
self.main_window = toga.Window(title=self.formal_name, closeable=True)
self.main_window.content = main_box
self.main_window.show()
def show_second_window(self, widget):
outer_box = toga.Box()
self.second_window = toga.Window(title='Second window')
self.windows.add(self.second_window)
self.second_window.content = outer_box
self.second_window.show()
self.main_window.close()
def main():
return MultiWindow()
遗憾的是它是一体的class但我会努力改进它
注意:在此解决方案中,不可能有主 window。只要您关闭主程序 window,该应用程序就会关闭。如果您只想在不关闭主 window 的情况下使用第二个 window,您仍然可以使用主 window.
如果我找到更好的解决方案,我会更新这个要点:
https://gist.github.com/yelluw/0acee8e651a898f5eb46d8d2a577578c
我目前正在尝试使用 Toga 创建带有 Beeware 的跨平台应用程序。 我知道如何更新 window 中的内容(我只是清空框中的所有内容并向其中添加新内容)。 但是现在我遇到了问题,我想添加需要分配给变量的条目字段,以便我可以获得它们的值(而且我的第一个 window 的 class 已经非常大了。 .. 所以我也不想添加新的属性和方法)。所以我的目的是在我的另一个 class 之外创建一个新的 class,它显示我的新 window 并关闭旧的(或者只是替换我的旧的)
E. g.:
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class FirstWindow(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN))
main_box.add(toga.Button('Open window 2', on_press=self.open_new_window))
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
def open_new_window(self, widget):
# This should close the current Window and display the other window
# return SecodnWindow() doesn't work
# close() and exit() doesn't work too, cause I can't execute code after this
# statements anymore
class SecondWindow(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN))
#adding all the stuff to the window
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
# Other code
def main():
return FirstWindow()
谢谢^^
我找到了解决方案:
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class MultiWindow(toga.App):
def startup(self):
main_box = toga.Box()
main_box.add(toga.Button('Open Window', on_press=self.show_second_window))
self.main_window = toga.Window(title=self.formal_name, closeable=True)
self.main_window.content = main_box
self.main_window.show()
def show_second_window(self, widget):
outer_box = toga.Box()
self.second_window = toga.Window(title='Second window')
self.windows.add(self.second_window)
self.second_window.content = outer_box
self.second_window.show()
self.main_window.close()
def main():
return MultiWindow()
遗憾的是它是一体的class但我会努力改进它 注意:在此解决方案中,不可能有主 window。只要您关闭主程序 window,该应用程序就会关闭。如果您只想在不关闭主 window 的情况下使用第二个 window,您仍然可以使用主 window.
如果我找到更好的解决方案,我会更新这个要点: https://gist.github.com/yelluw/0acee8e651a898f5eb46d8d2a577578c