首页 > 解决方案 > 如何将基于文本的程序制作成 GUI?tkinter 会是关键吗?

问题描述

我正在完成我的第一个 Python 项目。它是一个基于文本的程序转换公制和标准单位。我可以用什么将程序变成 GUI 程序。我研究过tkinter。但是,我不确定这是否是适合我情况的最佳解决方案。我很感激一些指导,因为我对编程真的很陌生。

标签: pythontkinter

解决方案


如果您在函数中有获取值并返回结果的代码,那就太好了 - 不使用input()andprint()

def inch_to_cm(value):
     return value * 2.54

因为你可以在基于文本的程序(控制台程序)中使用它input()

value = input('inch: ')

value = int(value)
result = inch_to_cm(value)
print(result)

或在命令行中使用参数script.py arguments

value = sys.argv[1]

value = int(value)
result = inch_to_cm(value)
print(result)

或者您可以轻松导入到任何 GUI ( Tkinter, PyQT, PyGTK, Kivy, 等)

import tkinter as tk
import script  # <-- import your function

def convert():
    value = inch_entry.get()
    value = int(value)
    result = script.inch_to_cm(value)  # <-- use your function
    cm_result['text'] = result
    
root = tk.Tk()

inch_label = tk.Label(root, text='inch:')
inch_label.grid(row=0, column=0)
                 
inch_entry = tk.Entry(root)
inch_entry.grid(row=0, column=1)

cm_label = tk.Label(root, text='cm:')
cm_label.grid(row=1, column=0)
                 
cm_result = tk.Label(root)
cm_result.grid(row=1, column=1)

button = tk.Button(root, text='Convert', command=convert)
button.grid(row=2, column=0, columnspan=2)

root.mainloop()  # it starts program

我认为该文件script.py就像

import sys

def inch_to_cm(value):
     return value * 2.54
    
if __name__ == '__main__':
    if len(sys.argv) > 1:
        value = sys.argv[1]
    else:
        value = input('inch: ')

    value = int(value)
    result = inch_to_cm(value)
    print(result)
     

它只需要if __name__ == '__main__'在直接执行时运行一些代码,而不是在导入其他程序时运行。


如果您在函数中没有代码,但您可以运行它,script.py argument那么您可以使用subprocess运行它并获得结果

 result = subprocess.check_output(['python', 'script.py', value])

这样,您可以使用几乎相同的 GUI 使用不同的程序


import tkinter as tk
import subprocess

def convert():
    value = inch_entry.get()
    result = subprocess.check_output(['python', 'script.py', value])
    cm_result['text'] = result.strip()
    
root = tk.Tk()

inch_label = tk.Label(root, text='inch:')
inch_label.grid(row=0, column=0)
                 
inch_entry = tk.Entry(root)
inch_entry.grid(row=0, column=1)

cm_label = tk.Label(root, text='cm:')
cm_label.grid(row=1, column=0)
                 
cm_result = tk.Label(root)
cm_result.grid(row=1, column=1)

button = tk.Button(root, text='Convert', command=convert)
button.grid(row=2, column=0, columnspan=2)

root.mainloop()  # it starts program and display window

如果您使用标准模块argparse在命令行中获取参数,那么有模块可以生成 GUI - Gooey


如果您的代码用于input()获取数据,那么它可能会产生更大的问题,您可能需要使用其他函数来向其他函数subprocess发送文本,input()它可能需要pexpect才能与这种类型的程序一起使用。


推荐阅读