我最近发现了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=TrueCanvas(哎呀!),甚至Button(哎呀!)所有这些替代方案都有缺点,但至少解决了一些问题.然而,我需要的是一种在应用程序级别捕获所有击键和鼠标点击的方法.在TkinterwxPython中,我会简单地将相关的events分别绑定到apppanel,但在Toga中找不到任何类似的东西.有人能帮帮忙吗?

谢谢

推荐答案

对于游戏或其他外观很重要的应用程序,我认为你可能需要使用Canvas来获得你想要的东西.我们在Toga的当前开发版本中对此做了一些重大改进,应该会在接下来的几周内发布.

Canvas有用于鼠标事件的处理程序,但没有用于按键的处理程序.然而,Toga在CommandAPI中确实有一个应用程序级别的按键处理程序.关于这个(1,2)有一些不完整的文档,我们将在下一个版本中对其进行改进.同时,您可以在example apps中找到更多示例代码.

Python相关问答推荐

如何将桌子刮成带有Se的筷子/要求/Beautiful Soup ?

不允许AMBIMA API请求方法

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

多处理代码在while循环中不工作

为什么这个带有List输入的简单numba函数这么慢

我们可以为Flask模型中的id字段主键设置默认uuid吗

如何在solve()之后获得症状上的等式的值

avxspan与pandas period_range

OR—Tools中CP—SAT求解器的IntVar设置值

Python—从np.array中 Select 复杂的列子集

对象的`__call__`方法的setattr在Python中不起作用'

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

形状弃用警告与组合多边形和多边形如何解决

移动条情节旁边的半小提琴情节在海运

转换为浮点,pandas字符串列,混合千和十进制分隔符

合并帧,但不按合并键排序

重置PD帧中的值

如何获取Python synsets列表的第一个内容?

OpenGL仅渲染第二个三角形,第一个三角形不可见

如何在海上配对图中使某些标记周围的黑色边框