在哪里可以声明StringVar来跟踪它并将其与OptionBox一起使用

2024-09-28 01:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直试图声明这个StringVar,这样当我更改一个选项框的内容时,另一个选项框的内容就会更新。虽然这个问题已经被问了很多次,但我似乎无法让它发挥作用。你知道吗

通常,您应该在组合框之前声明它,编写'update'例程,并在与'def'位于同一行的下面声明跟踪。这是可行的,但是我还想在许多其他例程中访问我的字符串var的值,因此用self声明它。我似乎不能同时让这两个东西都工作。你知道吗

下面是我的一些代码,请注意self.varRun和底部例程,因为它们必须相互配合(同时仍然能够在此类的其他例程中使用varRuns)。你知道吗

class createViewer(Tk.Frame):

    def __init__(self, parent, controller):
        Tk.Frame.__init__(self,parent)

        leftFrame = Tk.Frame(self)
        leftFrame.pack(side="left")

        botLeftFrame = Tk.Frame(leftFrame)
        botLeftFrame.pack(side="bottom")

        Import = Tk.Button(botLeftFrame)
        Import["text"] = "Import Frame"
        Import["command"] = self.importRun
        Import.pack(side="left", padx = 5, pady = 10)

        Load = Tk.Button(botLeftFrame)
        Load["text"] = "Load Frame"
        Load["command"] = self.loadRun
        Load.pack(side="left", padx = 5, pady = 10)

        runLabel = Tk.Label(botLeftFrame, text = "Select Run")
        runLabel.pack(side="left", padx = 5, pady = 10)


        cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb')
        cursor = cnxn.cursor()
        self.Runs = []
        cursor.execute("SELECT RunFilePath FROM tblRuns")
        rows = cursor.fetchall()
        for row in rows:
            self.Runs.append(row.RunFilePath)

        self.varRun = Tk.StringVar()
        self.varRun.set("None selected")
        self.varRun.trace('w', self.runSelectionChanged)

        self.SelectRun = Tk.OptionMenu(botLeftFrame, self.varRun, *self.Runs)
        self.SelectRun.pack(side="left", padx = 5, pady = 10)

        frameLabel = Tk.Label(botLeftFrame, text = "Select Frame")
        frameLabel.pack(side="left", padx = 5, pady = 10)

        self.varFrame = Tk.StringVar()
        self.Frames = ["holder","holder2"]
        self.SelectFrame = Tk.OptionMenu(botLeftFrame, self.varFrame, *self.Frames)
        self.varFrame.set("None selected")
        self.SelectFrame.pack(side="left", padx = 5, pady = 10)

        Home = Tk.Button(botLeftFrame, text="Home",command=lambda: controller.show_frame(createHome))
        Home.pack(side="left", padx = 5, pady = 10)


        topLeftFrame = Tk.Frame(leftFrame)
        topLeftFrame.pack(side="top", expand = True, fill = "both")

        img = Image.open("C:\Users\Jacob\workspace2\Blank2.png")
        blkImg = ImageTk.PhotoImage(img)
        self.ImageViewer = Tk.Label(topLeftFrame, image = blkImg)
        self.ImageViewer.image = blkImg
        self.ImageViewer.pack(side = "left", padx = 5, pady = 10)

        rightFrame = Tk.Frame(self, bg = "white")
        rightFrame.pack(side="right", padx = 5, pady = 10)

        self.alphaCount = 0
        self.betaCount = 0
        self.gammaCount = 0
        self.alphaText = Tk.StringVar()
        self.betaText = Tk.StringVar()
        self.gammaText = Tk.StringVar()

        self.alphaText.set("Alpha: 0")
        self.betaText.set("Beta: 0")
        self.gammaText.set("Gamma: 0")

        self.alpha = Tk.Label(rightFrame, textvariable = self.alphaText, bg = "white")
        self.alpha.pack(side="top", padx = 5, pady = 5)
        self.beta = Tk.Label(rightFrame, textvariable = self.betaText, bg = "white")
        self.beta.pack(side="top", padx = 5, pady = 5)
        self.gamma = Tk.Label(rightFrame, textvariable = self.gammaText, bg = "white")
        self.gamma.pack(side="top", padx = 5, pady = 5)

    def runSelectionChanged(self,*args):
        cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb')
        cursor = cnxn.cursor()
        cursor.execute("SELECT RunFilePath, RunID FROM tblRuns")
        rows = cursor.fetchall()
        for row in rows:
            if row.RunFilePath == self.varRun.get():
                chosenRunID = row.RunID

        cursor.execute("SELECT LocalFilePath FROM tblFrames WHERE RunID=?") (chosenRunID)
        self.userFrames = cursor.fetchall()
        for frame in self.userFrames:
            self.Frames.append(frame)

Tags: textimportselfleftframecursorsidelabel

热门问题