如何使用TkInter创建一个轻量级GUI

时间:2015-09-21 23:41:53

标签: python user-interface tkinter

我正在编写一个程序来读取和修改包含某些图像的信息的二进制文件:但是为了能够做到这一点,它还需要来自用户的一些信息,让我们说文件夹在哪里这个图像位于几个选择。

通过对网络的快速研究,我发现创建GUI的一种简单方法是Tkinter,事实上我很快达到了目标。 特别是我使用了tkFileDialogtkMessageBox模块而无需调用mainloop函数,每当我想在屏幕上显示某些内容时创建并销毁一个窗口:我不会'我认为这是正确的方法,但它非常适合我的应用程序,因为通过这种方式,我能够保留程序,因为它必须在#34; talk"与用户一起使用,无需使用纯粹反对的导向结构进行重构,如同真实的" GUI。

当我想改进这个界面并使用按钮小部件来提供从三个选项中进行选择的可能性时出现问题:在这种情况下,mainloop似乎是强制性的.. < / p>

所以这就是问题:它是否存在与用户通信的策略,而不必将所有函数放在GUI类中而不使用无限循环? (我认为使用Tkinter的答案是否定的) 这种混合情况下最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

我把骨架放在了一起。几点评论:

  1. 这是一个简单的例子,只有三个函数需要1或2个参数。但是,使它适应更多的功能和参数应该是直截了当的。
  2. 我绝对不会在实际程序中提倡短变量名称。
  3. 如果它在GUI.py中的逻辑b)适合你的逻辑b),请考虑在base.py中使用类a)
  4. 使用grid个可选参数来拥有漂亮的GUI。
  5. 总结上面的评论,目标是分离不同的部分:第一个模块将包含所有计算,但不会处理用户输入,第二个模块将使用命令行用户输入并依赖第一个用于计算,第三个用于计算,并且还依赖于第一个用于计算。您还可以为测试添加第四个。 当然,只要您知道原因,请随时修改此模式。

    欢迎评论。

    第一个模块:

    #file base.py
    def f1(input1):
        ...
        return res1
    
    def f2(res1, input2):
        ...
        return res2
    
    def f3(res2):
        ...
        return res3
    
    if __name__ == '__main__':
        r1 = f1('directoryPath')
        r2 = f2(r1, 'fileName')
        r3 = f3(r2)
    

    第二个模块:

    #file commandline.py
    from base import *
    
    i1 = input() # in 3.X, raw_input in 2.X
    r1 = f1(i1)
    
    i2 = input() # in 3.X, raw_input in 2.X
    r2 = f2(r1, i2)
    r3 = f3(r2)
    

    第三个模块:

    #file GUI.py
    from base import *
    import tkinter as tk # in 3.X, Tkinter in 2.X
    
    def compute():
        i1 = e1.get()
        r1 = f1(i1)
    
        i2 = e2.get()
        r2 = f2(r1, i2)
        r3 = f3(r2)
    
        l1.configure(text = r3) #if r3 is a string else str(r3) 
    
    app = tk.Tk()
    e1 = tk.Entry(app)
    e1.grid()
    
    e2 = tk.Entry(app) 
    e2.grid()
    
    b1 = tk.Button(app, text = "Compute", command = compute)
    b1.grid()
    
    l1 = tk.Label(app)
    l1.grid()
    
    app.mainloop()