如何使用许多窗口和功能来组织Tkinter代码

时间:2019-01-06 19:27:10

标签: python tkinter

我正在使用Python和Tkinter构建一个数据分析程序,该程序允许输入,绘制和导出数据(一种Excel克隆)。它实现了许多需要访问和修改共享数据变量的窗口和功能。我应该如何组织GUI以确保每个窗口都可以来回传输数据,同时还要分隔代码以能够独立修改和调试每个功能?

我最初用子功能构建了一个主GUI类(示例1),其中所有功能都易于修改和访问初始化的数据,因为所有变量都是通过self共享的。但是,随着我越来越多地修改代码(实际上是数千行),由于代码的划分不正确,调试变得非常困难。

我看到一个建议,使每个窗口(即数据表,绘图窗口等)成为独立的类(示例2),但是我想出了如何在类之间传递数据的唯一方法(将第一个窗口对象传递给其他窗口)似乎非常混乱,我唯一能想到的选择就是在定义/调用时将所有必需的变量显式传递给每个窗口,这也可能非常混乱。

示例1

class GUI:
    def __init__(self, toptk):
        self.toptk = toptk
        """ Code creating main window and toolbar """
        list_x = []
        list_y = []
        """ Code adding data """
    def entryTable(self):
        tablewin = Toplevel(self.toptk)
        """ Code creating frames, buttons, etc """
        """ Code doing something to list_x, list_y """
    def plotWin(self):
        plotwin = Toplevel(self.toptk)
        """ Code creating frames, buttons, etc """
        """ Code doing something to list_x, list_y """
    entryTable()
    plotWin()

root = tk.Tk()
main = GUI(root)
root.mainloop()

示例2

class GUI:
    def __init__(self, toptk):
        """ Code creating main window and toolbar """
        list_x = []
        list_y = []
        """ Code adding data """
        entryTable.__init__(toptk,self)
        plotWin.__init__(toptk,self)
class entryTable():
    def __init__(self,toptk,topGUI):
        tabletop = Toplevel(toptk)
        """ Code creating frames, buttons, etc """
        """ Code doing something to topGUI.list_x, topGUI.list_y """
class plotWin():
    def __init__(self,toptk,topGUI):
        plottop = Toplevel(toptk)
        """ Code creating frames, buttons, etc """
        """ Code doing something to topGUI.list_x, topGUI.list_y """

如何在保留类之间简单的变量交换的同时还允许我分别隔离和调试每个多窗口程序的方式来改进此多窗口程序的组织?

非常感谢您。

1 个答案:

答案 0 :(得分:0)

  

问题:如何在课程之间传递数据

此解决方案不会传递任何类,它简单地使用了全局 ICAO_ADEP <- c("DGAA","ZSPD","UAAA","RJTT","KJFK","WSSS") MVT_TIME_UTC <- c("01-Jan-2013 04:02:24", NA,"01-Jan-2013 04:08:18", NA,"01-Jan-2013 04:17:11","01-Jan-2013 04:21:52") flights <- data.frame(ICAO_ADEP, MVT_TIME_UTC) flights <- flights %>% mutate(MVT_TIME_UTC = lubridate::dmy_hms(MVT_TIME_UTC) 对象。也可以将此对象保存在自己的class DATA中,以进行DATA.py

import DATA