2017-05-03 4 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() 

これは、リンクからの解決策が見つかる場所です。私は2つの変数、 'currentcourse'と 'numberofteams'を持っています。これは1つのフレームから他のフレームに共有する必要があります。私はこれらの変数を次のコードで2つの異なるクラスに設定しようとしています。

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

あなたは(テキスト引数ではなく)textvariable引数としてSTRINGVARを使用する場合は、値が設定されています自動的に; set_teamnumberメソッドは必要ありません。私はあなたのコードには何も進んでいないような気がしません。詳細なヘルプが必要な場合は、[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)を入力してください。 – Novel

答えて

1

あなたはStringVarのインスタンスへshared_data["current_course"]を設定することにより開始したが、その後、あなたは単なる文字列にリセットしています。

それはStringVarですので、あなたが値を設定するsetメソッドを呼び出す必要があります:

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

ありがとう、申し訳ありませんが、投稿した質問が軽度である場合、明日までにプロジェクトを完了する必要があります。 – tdbridger

+0

これでも、変数をプリントすると、それでも空白が返ってくると思いますか? – tdbridger