使用 Python 的 tkinter
模块,你可以创建一个简单的图形用户界面(GUI)应用程序。tkinter
是 Python 标准库的一部分,适合用来开发基本的桌面应用。
以下是一个使用 tkinter
创建简单应用程序的示例。这个应用程序有一个标签、一个文本输入框、一个按钮,以及一个用于显示用户输入内容的标签。
1、问题背景
我想创建一个简单的应用程序来辅助学习。想法如下:
创建一个应用程序,它将仅运行与所选课程(单选按钮)关联的脚本文件。所以我创建了一些列出主题的单选按钮(供点击)。一旦选择了科目,用户必须点击回车键。这将运行所有已选科目的 .py 文件(execute_script 函数)。
但是,当我运行代码时,我会收到 4 个写着“无”的消息框,点击确定后,出现一个只有 Enter 按钮的方形窗口。我该如何解决这个问题?
def check(file_name, relStatus):
radioValue = relStatus.get()
tkMessageBox.showinfo('You checked', radioValue)
been_clicked.append(file_name)
return
def execute_script():
for name in been_cliked:
subprocess.Popen(['python', 'C:\Users\Max\Subjects\{}'.format(name)])
yield
def main():
# 创建应用程序
app = Tk()
app.title('Coursework')
app.geometry('450x300+200+200')
# 头部
labelText = StringVar()
labelText.set('Select subjects')
# 带有名称的词典
product_names = {}
names = []
file_name = []
names = ['Math', 'Science', 'English', 'French']
file_name = ['calc.py', 'physics.py', 'grammar.py', 'livre.py']
product_names = OrderedDict(zip(names, file_name))
# 创建单选按钮
global been_clicked
been_clicked = []
relStatus = StringVar()
relStatus.set(None)
for name, file_name in product_names.iteritems():
radio1 = Radiobutton(app, text=name, value=name, \
variable=relStatus, command=check(file_name, relStatus))
button = Button(app, text='Click Here', width=20, command=execute_script())
button.pack(side='bottom', padx=15, pady=15)
app.mainloop()
if __name__ == '__main__': main()
2、解决方案
根据上面提到的问题描述,可以发现:
for name in been_cliked
应该为for name in been_clicked
,函数调用多了括号,需要改为command=check
。- 由于
check
是一个回调函数,需要使用lambda
表达式将其作为参数传递给command
。 - 需要将
radio1.pack(side='top')
添加到for
循环中,以便将单选按钮添加到窗口。 - 同样地,
command=execute_script
应该改为command=execute_script
。 - 导入
subprocess
模块。 - 将
yield
改为return
。 - 在所有函数中,将
been_clicked
声明为全局变量。
以下是修改后的代码:
from subprocess import Popen
from tkinter import *
from tkinter import messagebox
app = Tk()
app.title('Coursework')
app.geometry('450x300+200+200')
labelText = StringVar()
labelText.set('Select subjects')
product_names = {}
names = []
file_name = []
names = ['Math', 'Science', 'English', 'French']
file_name = ['calc.py', 'physics.py', 'grammar.py', 'livre.py']
product_names = OrderedDict(zip(names, file_name))
global been_clicked
been_clicked = []
relStatus = StringVar()
relStatus.set(None)
def check(file_name, relStatus):
radioValue = relStatus.get()
messagebox.showinfo('You checked', radioValue)
been_clicked.append(file_name)
def execute_script():
for name in been_clicked:
Popen(['python', 'C:\Users\Max\Subjects\{}'.format(name)])
return
for name,file_name in product_names.iteritems():
radio1 = Radiobutton(app, text=name, value=name, \
variable=relStatus, command=lambda: check(file_name, relStatus))
radio1.pack(side='top')
button = Button(app, text='Click Here', width=20, command=execute_script)
button.pack(side='bottom', padx=15, pady=15)
app.mainloop()
将以上代码保存为 .py
文件,然后使用 Python 运行即可启动这个简单的 Tkinter 应用程序。在窗口中输入名字并点击提交按钮,程序会显示相应的问候消息。