【问题标题】:Accessing Tk Inter widgets from one class and displaying on another class从一个类访问 Tk Inter 小部件并在另一个类上显示
【发布时间】:2017-04-27 11:04:13
【问题描述】:

这是一个化学测验,我创建了 QUESTIONSTARTER 类作为对象。我正在尝试从该类访问小部件并将其放置在 STAGE1 类中,以便我可以将它们网格化,但在窗口上,这些框架上没有显示任何内容,所以我不知道该怎么做。 (我也想从按钮数据访问 tk 小部件,这是另一个类,但由于空间问题我无法显示)

class QUESTIONSTARTER(tk.Frame):
 def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    self.Attmepts = 3
    self.Points = 0
    self.NumberOfTimesSubmitBeenPressed = 0
    self.WordedQuestion = tk.Label(self)
    self.PointsLabel = tk.Label(self,text = self.Points)        
    self.AttemptsDisplayed = tk.Button(self, text = self.Attempts)
    self.AttemptsDisplayedText = tk.Label(self, text = "Attempts Displayed: ")

 def SetQuestionIntro(self):     
    WordedQuestion.config(text = "Many different organic compounds are synthesised by various routes but they may need specific type of reagents and conditions.")


 def SubmitClicked(self, Attempts):

    if self.Attempts == 1:
        NumberOfTimesSubmitBeenPressed += 1
    elif self.Attempts == 2:
        NumberOfTimesSubmitBeenPressed += 2
    elif self.Attempts == 3:
        NumberOfTimesSubmitBeenPressed += 2

    if NumberOfTimesSubmitBeenPressed == 3:
        controller.show_frame(F)
    else:
        print ("There was an Error")    

    #call at random the specific products from product database
    #depending on class run
 def ButtonPressed(self,ReagentsList):
    ReagentsList[0] = CorrectReagent
    self.CorrectReagent.configure(bg = 'green')
    IncorrectReagentsList = []
    IncorrectReagentsList.append(ReagentsList[1])
    IncorrectReagentsList.append(ReagentsList[2])
    IncorrectReagentsList.append(ReagentsList[3])

    for Reagents in IncorrectReagentsList:
        tk.Button[Reagents].configure(bg = "red")

    ConditionsList[0] = CorrectCondition
    self.CorrectCondition.configure(bg = "green")
    IncorrectConditionsList = []
    IncorrectConditionsList.append(ReagentsList[1])
    IncorrectConditionsList.append(ReagentsList[2])
    IncorrectConditionsList.append(ReagentsList[3])

    for Reagents in IncorrectReagentsList:
        tk.Button[Reagents].configure(bg = "red")




 def AllocatePointsStage1(self,frames ,ButtonPressed, Attempts, Points):


      while self.Attempts == 1:
           if self.ReagentOption1.bg == 'green' or self.ConditionOption1.bg == 'green':
            self.Points += 20
            controller.show_frame(Stage2)
            self.frames.remove(Stage2)
            self.frames.insert(Stage2)

           elif self.ReagentOption2.bg == 'green'or self.ConditionOption2.bg == 'green':
            self.Points += 20
            self.show_frame(Stage2)
            self.frames.remove(Stage2)
            self.frames.insert(Stage2)

           elif self.ReagentOption3.bg == 'green' or self.ConditionOption3.bg == 'green':
            self.Points += 20
            self.show_frame(Stage2)
            self.frames.remove(Stage2)
            self.frames.insert(Stage2)

           elif self.ReagentOption4.bg == 'green' or self.ConditionOption4.bg == 'green':
            self.Points += 20
            self.show_frame(Stage2)
            self.frames.remove(Stage2)
            self.frames.insert(Stage2)

           elif self.ReagentOption1.bg == 'red' or self.ConditionOption1.bg == 'red':
            self.Points += 0
            self.Attempts += 1

           elif self.ReagentOption2.bg == 'red' or self.ConditionOption2.bg == 'red':
            self.Points += 0
            self.Attempts += 1

           elif self.ReagentOption3.bg == 'red' or self.ConditionOption3.bg == 'red':
            self.Points += 0
            self.Attempts+= 1

           elif self.ReagentOption4.bg == 'red' or self.ConditionOption4.bg == 'red':
            self.Points += 0
            self.Attempts += 1

class STAGE1(tk.Frame):
 def __init__(self,parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller

    Stage1 = tk.Label(self, text = "STAGE 1")
    Stage1.grid(column=1,row=0)          

#从堆栈溢出解释每个类中的Main类和tk框架构造函数
self.ButtonData = BUTTONDATA(self,tk.Frame)
self.ButtonData.ReagentOption1.config(command=lambda: self.AllocatePointsStage(1)) self.ButtonData.ReagentOption2.config(command=lambda: self.AllocatePointsStage(1)) self.ButtonData.ReagentOption3.config(command=lambda: self.AllocatePointsStage(1)) self.ButtonData.ReagentOption4.config(command=lambda: self.AllocatePointsStage(1))

    self.ButtonData.ConditionOption1.config(command=lambda: self.AllocatePointsStage(1))
    self.ButtonData.ConditionOption2.config(command=lambda: self.AllocatePointsStage(1))
    self.ButtonData.ConditionOption3.config(command=lambda: self.AllocatePointsStage(1))
    self.ButtonData.ConditionOption4.config(command=lambda: self.AllocatePointsStage(1))

    self.ButtonData.ReagentOption1.grid(column = 2,row = 5)
    self.ButtonData.ReagentOption2.grid(column = 2,row = 6)
    self.ButtonData.ReagentOption3.grid(column = 2,row = 7)
    self.ButtonData.ReagentOption4.grid(column = 2,row = 8) 

    self.ButtonData.ConditionOption1.grid(column = 10,row = 5)
    self.ButtonData.ConditionOption2.grid(column = 10,row = 6)
    self.ButtonData.ConditionOption3.grid(column = 10,row = 7)   
    self.ButtonData.ConditionOption4.grid(column = 10,row = 8)

    self.Continue = tk.Button(self, text = "Continue", command=lambda: controller.show_frame(Stage2))
    self.Continue.grid(column = 6)

    self.QuestionStarter = QUESTIONSTARTER(self,tk.Frame)
    self.QuestionStarter.PointsLabel.grid(row=0,column=6)
    self.QuestionStarter.AttemptsDisplayed.grid(row=1,column=7)
    self.QuestionStarter.WordedQuestion.grid(row=0,column=1)
    self.QuestionStarter.AttemptsDisplayedText.grid(row=1,column=8)
    DesiredProductLabel = tk.Label(self,command=lambda: ShowDesiredProduct(DesiredProduct))
    DesiredProductLabel.grid(row=5,column=0)

 def ShowDesiredProduct(self,DesiredProduct):
    DesiredProduct = GetDesiredProduct()
    return DesiredProduct

【问题讨论】:

标签: python oop tkinter widget tk


【解决方案1】:

你不能做你想做的事。小部件存在于具有父/子关系的树状结构中,小部件不能在树上移动,然后在不同的分支下移动。此外,任何给定的小部件一次不能在多个位置显示,因此如果您将其放在页面 A 中,为了将其放入页面 B,您必须将其从页面 A 中删除。

唯一的解决方案是复制小部件。如果它们要显示相同的数据,您可以让它们共享相同的变量(即:textvariable 属性)。当两个或多个小部件共享相同的textvariable 时,在一个小部件中所做的更改将立即在另一个小部件中进行。

有关访问其他页面中的小部件的更多信息,请参阅How to access variables from different classes in tkinter python 3

有关您开始使用的代码架构的更多信息,请参阅https://stackoverflow.com/a/7557028/7432

【讨论】:

  • 所以我必须在该类中再次制作 tk 按钮和标签,然后将它们网格化。例如尝试显示?我有点困惑,因为它是我程序的重要组成部分。 @bryan-oakley
  • 看看我回复了什么,如果你没有得到它@BryanOakley
  • @Ammar:你不能在两个地方都有一个小部件。您必须创建两个小部件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2015-02-06
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多