Почему моя кнопка не печатает заданную функцию? - PullRequest
0 голосов
/ 15 мая 2019

Это уменьшенная версия моей большей программы. Когда я нажимаю «Вперед» Button на «Неделе 1», он должен вывести «Привет, со 2-й недели» , однако он все еще печатает «Привет, с 1-й недели».

Просто чтобы убедиться, что я назначаю правильный виджет кнопки, потому что этот виджет появился в нескольких местах, поэтому я использовал строку ниже только для проверки, и она работала с конкретным виджетом, который я хочу.

self.parent.parent.sheet_dict["Week2"].upper_tabs_dict["Final"].button.configure(text = "red")

Я не знаю, почему моя forward(self): функция не работает.

Спасибо, что нашли время помочь мне в этом.

Вот полный код:

import tkinter as tk
from tkinter import ttk
from functools import partial

class Application(tk.Tk):
    def  __init__(self):
        super().__init__()
        self.title("notbook my own try")
        self.geometry("700x450")
        self.config(bg="tan")

        self.style = ttk.Style() # instantce of ttk.Style() class.
        self.lnb = Sheets(self) #composition (application has child)

class Sheets(ttk.Notebook): #contains the weeks tabs
    def __init__(self, parent): #parent is root, which is tk.
        parent.style.configure("down.TNotebook", tabposition="sw")
        super().__init__(parent, style = "down.TNotebook")# this parent   
               is Notebook class.
        self.pack(fill = tk.BOTH, expand =1)
        self.parent = parent

        self.week_index = ['Week 1', 'Week 2',"Week 3", "Week 4"] #
        self.sheet_dict = {} #holds all the One_Weekly_Notebook's 
                     instances

        for week in (self.week_index):
            self.week = One_Weekly_Notebook(self)#create instances
            self.week.pack()
            self.add(self.week, text = week)
            self.pack()
            self.sheet_dict[week] = self.week


class One_Weekly_Notebook(ttk.Notebook): #contains the tabs
    def __init__(self, parent):
        super().__init__(parent)
        self.pack(fill = tk.BOTH, expand =1)
        self.parent = parent

        self.upper_tabs_dict = {}
        self.calculate_buttons_dict = {} #to store all the calculate 
                  buttons in differnt weeks

        self.object_final = Final(self)
        self.object_requests = Requests(self)
        self.object_control = Control(self)

        tab1 = self.object_final #child of lower notebook
        tab2 = self.object_requests
        tab3 = self.object_control
        tab1.pack()
        tab2.pack()
        tab3.pack()

        self.add(tab1, text = "Final")
        self.pack()
        self.add(tab2, text = 'Requests')
        self.pack()
        self.add(tab3, text = 'Control')
        self.pack()

        self.upper_tabs_dict["Final"] = tab1
        self.upper_tabs_dict["Requests"] = tab2
        self.upper_tabs_dict["Control"] = tab3

    def display_results(self, button): #layer 3
        self.say_hi(button)

    def say_hi(self,button): #layer 3
         self.id =    
        self.parent.parent.lnb.index(self.parent.parent.lnb.select())+1
#             button=     
        self.parent.parent.lnb.index(self.parent.parent.lnb.select())+1
        print (f"Hi from {button}")#current tap #)

class Final(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.pack(fill=tk.BOTH, expand=1)
        self.parent = parent


        self.buttons()
    def buttons(self):
        self.button = tk.Button(self, text="Say Hi", bg="salmon")
        self.button.configure(command= lambda button=self.button:    
           self.parent.display_results(button))
        self.button.pack()
        self.parent.calculate_buttons_dict = self.button

        self.buttonc = tk.Button(self, text = "Forward", command =   
           self.forward)
        self.buttonc.pack()


        print (self.parent.calculate_buttons_dict)

    def forward(self):
        self.parent.display_results(self.parent.parent.sheet_dict["Week   
            1"].upper_tabs_dict["Final"].button)
        self.parent.display_results(self.parent.parent.sheet_dict["Week 
            2"].upper_tabs_dict["Final"].button)
        self.parent.display_results(self.parent.parent.sheet_dict["Week 
            3"].upper_tabs_dict["Final"].button)
        self.parent.display_results(self.parent.parent.sheet_dict["Week 
           4"].upper_tabs_dict["Final"].button)

class Requests(Final):
    pass

class Control(tk.Frame):
    pass

if __name__ == '__main__':
    Application().mainloop()


enter code here

1 Ответ

0 голосов
/ 17 мая 2019

Я до сих пор не могу полностью понять, чего вы пытаетесь достичь, но давайте разберемся на более мелкие кусочки.

Во-первых, в вашей текущей forward функции:

self.parent.parent.sheet_dict["Week 2"].upper_tabs_dict["Final"].button.configure(command= self.parent.display_results)

Это только изменяет команду кнопки. Судя по всему, вместо этого вы хотите выполнить команду. Если это так, просто вызовите метод напрямую:

self.parent.parent.sheet_dict["Week 2"].display_results()

Далее вы также сказали, что ожидаете напечатать «Привет, со 2-й недели», когда нажмете кнопку «Вперед» на «1-й неделе», но она по-прежнему будет печатать «Привет, с 1-й недели». Есть на самом деле, как вы кодировали это прямо сейчас, и как он себя ведет. Из вашего say_hi метода:

print (f"Hi from {self.parent.parent.lnb.index(self.parent.parent.lnb.select())+1}")

Вы просматриваете индекс текущей записной книжки. Поэтому он всегда будет печатать текущий индекс вкладки, даже если вы указали sheet_dict["Week 2"].

Мое предложение состоит в том, чтобы включить индекс в первую очередь при создании вашего ноутбука:

class Sheets(ttk.Notebook):
    def __init__(self, parent):
        ...
        for num, week in enumerate(self.week_index,1): #pass an index, starting from 1
            self.week = One_Weekly_Notebook(self,num)
            self.week.pack()
            self.add(self.week, text = week)
            self.pack()
            self.sheet_dict[week] = self.week

class One_Weekly_Notebook(ttk.Notebook):
    def __init__(self, parent,index):
        super().__init__(parent)
        self.pack(fill = tk.BOTH, expand =1)
        self.index = index #store the index as an attribute
        self.parent = parent
        ...

    def say_hi(self): #layer 3
        print (f"Hi from {self.index}")

Тогда он всегда должен возвращать правильный индекс, указанный в вашем forward методе.

...