Python 除非按下 ctrl 键,否则 Tkinter 不会完全加载

Python Tkinter does not completely load unless ctrl key is pressed

我正在使用 Ubuntu 18.04 和 python 3.8。

这是我使用Tkinter以来一直遇到的问题

每当我编写代码时,由于某种原因,GUI 在加载时会卡住。我推测这是因为我打算编写的程序涉及很多按钮(具体为 15x15=225)。然而,GUI window 直接拒绝显示,而不是加载速度变慢或其他什么。

我偶然发现的唯一 'pseudo-solution' 是按 ctrl 键。

为什么会出现这种情况,为什么按 ctrl 键可以解决这个问题?

代码如下: 要 运行,安装 tkinter 并输入 python3 controller.py

model.py

class Model:
    def __init__(self):
        '''
        '''

controller.py

 from model import Model
 from view import View
 
 class Controller:
     def __init__(self):
         self.model = Model()
         self.view = View(self)
     def main(self):
         self.view.main()
 if __name__ == '__main__':
     scrabble = Controller()
     scrabble.main()

view.py

 import tkinter as tk
 from tkinter import ttk
 
 class View(tk.Tk):
     PAD = 15
     def __init__(self,controller):
         super().__init__()
         self.controller = controller
         self.value_var = tk.StringVar()
         self.title('Scrabble')
         self._make_main_frame()
         self._make_buttons()

     def main(self):
         self.mainloop()
 
     ##Private Methods
     def _make_main_frame(self):
         self.main_frm = ttk.Frame(self)
         self.main_frm.pack(padx=self.PAD, pady=self.PAD)
 
     def _make_buttons(self):
         outer_frm= ttk.Frame(self.main_frm)
         outer_frm.pack()
 
         frm = ttk.Frame(outer_frm)
         frm.pack()
         btns_row = 0 
         for i in range(self.PAD*15):
             if btns_row == self.PAD:
                 frm = ttk.Frame(outer_frm)
                 frm.pack()
                 btns_row = 0
             btn = ttk.Button(frm, text=i)
             btn.pack(side='left')
             btns_row += 1

有趣的是,当我将 ubuntu 从 18.04 升级到 20.04 时,这个问题似乎已经消失了。出于好奇,我增加了要加载的按钮数量。这样做之后,有问题的行为又回来了。

最近有机会测试一下其他电脑是否存在这个问题。其他电脑(比如Acer)好像直接上不去,好像永远卡死(或者还没找到摆脱卡死的方法)。

因此,我认为问题出在 tkinter 本身(或者它不应该以这种方式使用)。截至目前,除了避免使用 200 多个按钮(至少在 ubuntu tkinter 中)之外别无他法。

我 运行 在 arm64 上 运行ning Tkinkter ubuntu 遇到了同样的问题。我尝试加载在 github 上找到的其他应用程序,它们的行为似乎都一样。对我来说,这似乎更像是一个优先级问题或竞争条件,按钮越多,条件发生的机会就越大。

我找到了一个“变通办法”,它不太理想,但允许我使用我的应用程序。不是我所说的解决方案。

通过降低应用程序的“友好度”,从而提高进程的优先级,一切都可以快速且完整地加载。这样做的缺点是您需要 运行 您的应用程序具有管理权限。更改优先级可能还有其他 concerns/side 效果。

import os

# decrease the niceness by 1 to increase the process priority
os.nice(-1)