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)
我正在使用 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)