使用Python Tkinter创建一个简单的应用程序

2024-08-07 09:53:22 浏览数 (4)

使用 Python 的 tkinter 模块,你可以创建一个简单的图形用户界面(GUI)应用程序。tkinter 是 Python 标准库的一部分,适合用来开发基本的桌面应用。

以下是一个使用 tkinter 创建简单应用程序的示例。这个应用程序有一个标签、一个文本输入框、一个按钮,以及一个用于显示用户输入内容的标签。

1、问题背景

我想创建一个简单的应用程序来辅助学习。想法如下:

创建一个应用程序,它将仅运行与所选课程(单选按钮)关联的脚本文件。所以我创建了一些列出主题的单选按钮(供点击)。一旦选择了科目,用户必须点击回车键。这将运行所有已选科目的 .py 文件(execute_script 函数)。

但是,当我运行代码时,我会收到 4 个写着“无”的消息框,点击确定后,出现一个只有 Enter 按钮的方形窗口。我该如何解决这个问题?

代码语言:javascript复制
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:UsersMaxSubjects{}'.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 声明为全局变量。

以下是修改后的代码:

代码语言:javascript复制
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:UsersMaxSubjects{}'.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 应用程序。在窗口中输入名字并点击提交按钮,程序会显示相应的问候消息。

1 人点赞