带有 Tkinter 和多个文件的 Python GUI

Posted

技术标签:

【中文标题】带有 Tkinter 和多个文件的 Python GUI【英文标题】:Python GUI with Tkinter and Multiple Files 【发布时间】:2018-09-21 10:53:20 【问题描述】:

所以我意识到我在代码中犯了一些初学者错误。所以我做了几步回到最初的尝试。我有一个带有一个窗口的小 GUI。

现在我有一些问题:

    为什么greet必须有(self)? 我如何从另一个 py 文件中调用(在这里调用正确的词吗?)问候?

提前致谢。

from tkinter import *

class MyFirstGUI(object):
    def __init__(self, master):
        self.master = master
        master.title("A simple GUI")

        self.label = Label(master, text="This is our first GUI!").pack()

        self.greet_button = Button(master, text="Greet", command=self.greet).pack()

        self.close_button = Button(master, text="Close", command=self.quit).pack()

    def greet(self):
        print('Hello')

    def quit(self):
        self.master.destroy()


root = Tk()
my_gui = MyFirstGUI(root)
root.mainloop()

【问题讨论】:

第一个问题请看这篇文章:What is the purpose of self? 【参考方案1】:

为什么greet必须有(self)?

其他程序语言使用@ 来定义不同的类属性,但是python 使用self 来实现这一点。 self 在类中使用,让类知道有一个类属性或方法可以从类中的任何位置(或从类外)访问。

示例优势:如果我们有一个更新变量的函数和对该函数的调用,我们将需要使用global,并且该函数的调用必须在代码中定义该函数之后发生。

像这样:

x = 0

def update_x():
    global x
    x+=1
    print(x)

update_x()

然而,在一个类中,我们可以避免使用global,并在调用这些方法的代码之后定义我们所有的方法(使用 self 的类中的函数),让我们保持更简洁。

像这样:

class MyClass():
    def __init__(self):
        self.x = 0
        self.update_x()

    def update_x(self):
        self.x +=1
        print(self.x)

MyClass()

我如何从另一个 py 文件中调用(在这里调用正确的词?)问候?

您需要像导入库一样导入文件。

例如,如果说您的主程序在 main.py 中,并且在同一目录中有另一个名为 test.pypy 文件,并且您希望从 main.py 文件中调用 test.py 文件中的某些内容将需要在main.py 文件中导入test.py 文件

对于位于同一目录下的大多数文件,请执行以下操作:

import test

有时您的程序位于某种包中,您可能需要像这样提供导入。

import package_name.test

您可以将其用作测试示例:

test.py 文件包含:

def plus_one(number):
    x = number + 1
    return x

main.py 文件包含:

import test

x = test.plus_one(5)
print(x)

控制台输出应该是:

6

【讨论】:

@K-Doe 很高兴为您提供帮助。如果我的答案对您有用,请确保选中答案旁边的复选框。 当然! :) 祝你有美好的一天!【参考方案2】:

1. 为什么greet也要有(self)?

函数greet()是你的MyFirstGUI类的一个函数,你可以看到当你把这个函数绑定到greet_button时,这个函数放在self之后。这意味着该函数具有指向self(即MyFirstGUI)的链接。此链接是通过将 self 放入函数定义中来建立的。

2.我如何从另一个 py 文件中调用(在这里调用正确的词?)greet? (我不确定我是否理解您的要求)

是的,电话是对的!如果你想从另一个文件调用这个函数,你必须在你的主文件中导入MyFirstGUI并创建这个对象的一个​​实例。

mainFile.py:

from tkinter import *
from guiFile import MyFirstGUI

root = Tk()
my_gui = MyFirstGUI(root)
my_guy.greet()
root.mainloop()

guiFile.py:

from tkinter import *    
class MyFirstGUI(object):
    def __init__(self, master):
        self.master = master
        master.title("A simple GUI")

        self.label = Label(master, text="This is our first GUI!").pack()

        self.greet_button = Button(master, text="Greet", command=self.greet).pack()

        self.close_button = Button(master, text="Close", command=self.quit).pack()

    def greet(self):
        print('Hello')

    def quit(self):
        self.master.destroy()

【讨论】:

要清楚,当一个函数在一个类的一侧并使用self时,它被称为一个方法。同样,如果使用self. 分配变量,则称为类属性。 您好,感谢您的解释,它运行良好,我明白发生了什么!还有一种方法可以在没有 GUI 启动的情况下使用 greet 吗? 代码做了它应该做的,但是如果显示 MyFirstGUI 并且我按下退出按钮,它会说:“名称'root'未定义”。但是 root = Tk() 在代码中? 嗬,是的,这可能是因为当您在一个窗口中按quit() 时,self.master.destroy() 删除了rootinstance... 也许您应该将其替换为self.destroy() 以仅退出你想退出的窗口! @Mike-SMT 只是属性或实例属性。一个类属性将在 class 上。如果实例没有此类属性,则可以通过self. 读取,但要分配,您必须通过类。

以上是关于带有 Tkinter 和多个文件的 Python GUI的主要内容,如果未能解决你的问题,请参考以下文章

带有 cx_freeze 的 python 3.2 tkinter 图标

结合 Tkinter 和 win32ui 使 Python 在退出时崩溃

在多处理之前调用 Tkinter 会导致多个窗口?

多处理:带 GUI 的父/子(tkinter)

让 tkinter 在带有 asdf 的 macos 上使用 python 3.x

带有 MySQLdb 的 Python Tkinter 列表框