带有 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.py
的 py
文件,并且您希望从 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()
删除了root
instance... 也许您应该将其替换为self.destroy()
以仅退出你想退出的窗口!
@Mike-SMT 只是属性或实例属性。一个类属性将在 class 上。如果实例没有此类属性,则可以通过self.
读取,但要分配,您必须通过类。以上是关于带有 Tkinter 和多个文件的 Python GUI的主要内容,如果未能解决你的问题,请参考以下文章
带有 cx_freeze 的 python 3.2 tkinter 图标
结合 Tkinter 和 win32ui 使 Python 在退出时崩溃