无法在ubuntu 16.04.2上的tkinter中使用tk.mainloop()

时间:2017-03-25 19:36:09

标签: python python-3.x ubuntu tkinter ubuntu-16.04

每当我尝试在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()

这是一个屏幕截图,显示程序输出时我运行它:

enter image description here

在此之前,我收到一条错误消息,指出_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应用程序以及可以采取哪些措施来解决这个问题?

2 个答案:

答案 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()

显示以下窗口:

enter image description here

答案 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)

证明所提供的解释。

我为您的问题提供的解释(上面的为什么?)说明有两个事实可以引导您解决这个问题。如果其中一个人满意,问题就会消失:

  1. 保留super(MainApplication, self).__init__(parent, *args, **kwargs),但要求pack()至少绘制一个小部件:

    MainApplication
  2. 您将看到GUI:

    enter image description here

    1. 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()
    2. 您可以看到GUI:

      enter image description here