簡體   English   中英

Tkinter更改共享變量

[英]Tkinter change a shared variable

我正在使用一種解決方案來嘗試在我的整個代碼中共享變量,該代碼由“ Frame”類組成。 但是,我嘗試更改這些共享變量的值的任何嘗試似乎都沒有效果,並且在嘗試更改它們之后,如果我將其打印出來,只會返回空白。 任何幫助,將不勝感激。

class GolfApp(tk.Tk):
    def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)
    self.shared_data = {
        "currentcourse": tk.StringVar(),
        "numberofteams": tk.IntVar()}

    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand=True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0, weight=1)

    self.frames = {}
    for F in (MainMenu, CreatePage, ViewPage, GetTeamsPage, ChooseCourse, 
              AddCourse, LoginSignUp, Login, SignUp, Highscores1, Highscores2,
              Scorecards1, Scorecards2):
        page_name = F.__name__
        frame = F(parent=container, controller=self)
        self.frames[page_name] = frame
        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame("LoginSignUp")

def show_frame(self, page_name):
    frame = self.frames[page_name]
    frame.tkraise()

在這里可以找到鏈接的解決方案。 我有兩個變量,“當前課程”和“團隊數量”,我需要從一個框架共享給其他框架。 我試圖在下面的代碼位中在兩個不同的類中設置這些變量。

class GetTeamsPage(tk.Frame):
    def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    self.configure(background="lightgreen")

    def set_teamnumber():
        numberofteams = answerentry.get()            
        numberofteams = self.controller.shared_data["numberofteams"].get()

    def testInt(inStr, i, acttyp):
        ind = int(i)
        if acttyp == '1':
           if not inStr[ind].isdigit():
               return False
        return True

    for col in range(7):
        self.grid_columnconfigure(col)


    for row in range(5):
        self.grid_rowconfigure(row)

    questionlbl = tk.Label(self,
                           text="How many teams/players are there?",
                           bg="lightgreen",
                           font = "Verdana 20 bold")

    questionlbl.grid(column=2,
                     row=0,
                     columnspan=3)

    answerentry = tk.Entry(self,
                           text="Enter a number here.",
                           validate = "key",
                           textvariable=self.controller.shared_data["numberofteams"])

    answerentry.grid(column=2,
                     row=2,
                     columnspan=3)

    moveonbtn = tk.Button(self,
                          text="Continue",
                          height = "3",
                          width = "40",
                          bg="darkgreen",
                          fg="lightgreen",
                          command = lambda: (controller.show_frame("CreatePage"), set_teamnumber()))

    moveonbtn.grid(column=1,
                   row=5,
                   columnspan=3)

    returnbtn = tk.Button(self,
                          height="3",
                          width="40",
                          bg="darkgreen",
                          fg="lightgreen",
                          text="Return to main menu",
                          command = lambda: controller.show_frame("MainMenu"))

    returnbtn.grid(column=4,
                   row=5,
                   columnspan=3)

class ChooseCourse(tk.Frame):
    def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    self.configure(background="lightgreen")
    cursor.execute("SELECT CourseName FROM Course")
    coursetuple = cursor.fetchall()
    courselist = [row[0] for row in coursetuple]


    def get_choice():
        currentcourse = self.controller.shared_data["currentcourse"]
        currentcourse = listmenu.get()


    for col in range(2):
        self.grid_columnconfigure(col, minsize=50)

    for row in range(7):
        self.grid_rowconfigure(row, minsize=60)

    titlelbl = tk.Label(self,
                        text="Choose a course",
                        bg="lightgreen",
                        font = "Verdana 20 bold")

    titlelbl.grid(column=2,
                  row=0)

    addbtn = tk.Button(self,
                       text="Add a new course",
                       bg="darkgreen",
                       fg="lightgreen",
                       command = lambda: controller.show_frame("AddCourse"))

    addbtn.grid(column=2,
                row=3)

    continuebtn = tk.Button(self,
                            text="Continue",
                            bg="darkgreen",
                            fg="lightgreen",
                            command = lambda: (controller.show_frame("GetTeamsPage"), get_choice))

    continuebtn.grid(column=2,
                     row=4)

    returnbtn = tk.Button(self,
                          text="Return to main menu",
                          bg="darkgreen",
                          fg="lightgreen",
                          command = lambda: controller.show_frame("MainMenu"))

    returnbtn.grid(column=2,
                   row=5)


    listmenu = tk.Listbox(self)

    for x in range(0, len(courselist)):     
            listmenu.insert("end", courselist[x])

    listmenu.grid(column=2,
                     row=1)

首先,將shared_data["current_course"]設置為StringVar的實例,但隨后將其重置為一個字符串。

由於它是StringVar ,因此您需要調用set方法來設置值:

currentcourse = self.controller.shared_data["currentcourse"]
currentcourse.set(listmenu.get())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM