2017-05-03 132 views
0

我正在使用a solution发现可以在我的代码中共享变量,其中包含'Frame'类。然而,我试图改变这些共享变量的值的任何尝试似乎都没有效果,并且在我尝试更改它们后,如果我打印它只是返回空白。任何帮助,将不胜感激。Tkinter更改共享变量

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() 

这是可以找到链接的解决方案的地方。我有两个变量,'currentcourse'和'numberofteams',我需要从一个框架分享给其他人。我试图在以下代码位中的两个不同类中设置这些变量。

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) 
+0

然后将值设置自动;你不需要set_teamnumber方法。我不想进一步涉及你的代码;如果您需要更多帮助,请提供[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 – Novel

回答

1

您可以通过设置shared_data["current_course"]StringVar一个实例开始,但后来你重置它只是一个字符串。

既然是StringVar,你需要调用set方法来设置值:如果您使用STRINGVAR作为textvariable参数(而不是一个文本参数)

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

非常感谢,对不起,如果我发布的问题是卑鄙的,需要明天完成项目。 – tdbridger

+0

即使是这样,当我来说打印变量它仍然返回空白,有什么想法? – tdbridger