我最近发现了Beeware/Toga
,我正在考虑改用它:它比Tkinter
好得多,而且似乎比wxPython
更直接,在开发和运行时都更快.所以我试着开发了几个玩具应用程序,其中一个长得像SimpleSudoku个.
用户界面很简单:它在已求解的单元格中显示值,或在仍未求解的单元格中显示剩余的"候选值".然后,通过单击单元格或使用箭头键移动到单元格来 Select 该单元格,并键入要插入的值,或键入Alt-<value>
以删除候选值.还有更多的可能性,但让我们暂时忽略它们.
以下代码是首次try 构建预览(在Windows上测试):
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
class SSClone(toga.App):
def startup(self):
main_box = toga.Box(style=Pack(direction=COLUMN, padding=5))
self.tiles = []
self.values = '123456789'
self.size = len(self.values)
label_text = ' '.join(self.values)
tile_size = 40
vbox = toga.Box(style=Pack(direction=COLUMN, padding=0, background_color='grey'))
for i,r in enumerate(range(self.size)):
hbox = toga.Box(style=Pack(direction=ROW, padding=(2,0,0,0), background_color='lightgrey'))
for c in range(self.size-1):
tile = toga.Label(label_text, style=Pack(padding=2, width=tile_size, height=tile_size, font_family='monospace', font_size=7))
hbox.add(tile)
self.tiles.append(tile)
tile = toga.Label(f' {self.values[i]}', style=Pack(padding=2, width=tile_size, height=tile_size, font_family='monospace', font_size=15, alignment='center', font_weight='bold', background_color='aqua'))
hbox.add(tile)
self.tiles.append(tile)
vbox.add(hbox)
main_box.add(vbox)
self.tiles[0].style.background_color='yellow'
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
我在这里用了Label
,但也可能会想到TextInput
,每个候选人readonly=True
、Canvas
(哎呀!),甚至Button
(哎呀!)所有这些替代方案都有缺点,但至少解决了一些问题.然而,我需要的是一种在应用程序级别捕获所有击键和鼠标点击的方法.在Tkinter
或wxPython
中,我会简单地将相关的events
分别绑定到app
或panel
,但在Toga
中找不到任何类似的东西.有人能帮帮忙吗?
谢谢