每当我尝试在ubuntu 16.04.2上使用tkinter
运行一个简单的tk.mainloop()
程序 - 或该程序的任何程序时,我都无法打开应用程序窗口,并且会显示一个问号窗口图标。
这是我正在运行的程序:
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super(MainApplication, self).__init__(parent, *args, **kwargs)
if __name__ == '__main__':
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
这是一个屏幕截图,显示程序输出时我运行它:
在此之前,我收到一条错误消息,指出_tkinter
可以加载。为解决此问题,我使用tkinter
然后sudo apt-get update
为ubuntu下载了最新版本的sudo apt-get install python3-tk
。如果这也很重要,我在使用Windows 10的双启动配置中使用ubuntu。
我还阅读了How can I fix program icons that appear as a question mark in the Launcher?和Why do some open applications appear as “question marks” in the Unity launcher?,但这些问题似乎涉及如何修复应用程序桌面图标,而不是如何修复无法运行的应用程序。此外,问题似乎是处理特定的ubuntu应用程序。
有谁知道为什么ubuntu没有正确运行tkinter
应用程序以及可以采取哪些措施来解决这个问题?
答案 0 :(得分:2)
虽然我看起来不像,tkinter
窗口实际上就在那里。要看小是很简单的,因为它内部没有小部件可以扩展它。一旦开始向窗口添加小部件,它就会变得可见。
例如,要使用相关代码显示窗口,
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super(MainApplication, self).__init__(parent, *args, **kwargs)
if __name__ == '__main__':
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
您可以添加tk.Button()
窗口小部件以强制窗口展开:
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super(MainApplication, self).__init__(parent, *args, **kwargs)
# create a button widget to force the window to expand to fit
# the button
self.btn = tk.Button(self, text='btn', bg='blue')
self.btn.pack(side='bottom')
if __name__ == '__main__':
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
显示以下窗口:
答案 1 :(得分:0)
尝试稍微更改程序的主要部分:
if __name__ == '__main__':
root = tk.Tk()
your_class_instance = MainApplication(root)
print(your_class_instance)
root.mainloop()
您将在终端上看到类似这样的内容:.140449273960656
现在让我们回到原始代码:
if __name__ == '__main__':
root = tk.Tk()
your_class_instance = MainApplication(root).pack(side="top", fill="both", expand=True)
print(your_class_instance)
root.mainloop()
您将在终端上看到None
。
为什么?这是因为tkinter(pack()
,place()
和 grid()
)的布局管理员总是返回{{ 1}}和None
类没有小部件。
换句话说,你试图什么都不显示。
请注意MainApplication
在这一行中没用:
pack(your_options_list)
它不仅无用,而且还会阻止应用程序进一步扩展,因为无法使用MainApplication(root).pack(side="top", fill="both", expand=True)
类的实例。
也许这对您的实际问题不是必需的,但是作为旁注,因为您使用的是Python 3,您可以使用:MainApplication
代替super().__init__(parent, *args, **kwargs)
我为您的问题提供的解释(上面的为什么?)说明有两个事实可以引导您解决这个问题。如果其中一个人满意,问题就会消失:
保留super(MainApplication, self).__init__(parent, *args, **kwargs)
,但要求pack()
至少绘制一个小部件:
MainApplication
您将看到GUI:
让import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super(MainApplication, self).__init__(parent, *args, **kwargs)
# I add these 2 following lines
self.parent = parent
self.initialize_gui()
def initialize_gui(self):
# Ok, let us draw one useless button for a test
self.button_1 = tk.Button(self.parent, text="Do nothing")
self.button_1.pack()
if __name__ == '__main__':
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
类不绘制任何小部件,但删除MainApplication
:
pack()
您可以看到GUI: