Проблемы с Tkinter из-за наличия кнопок во вторичном (втором) окне при нажатии кнопки в главном окне - PullRequest
0 голосов
/ 28 ноября 2018

Теперь я могу сгенерировать код, который открывает новое окно с записями, когда я нажимаю кнопку «Тест» в первом окне.Однако у меня возникают проблемы при создании кнопок во втором окне.Записи созданы, но нет кнопок.Также в качестве дополнительного вопроса я хотел бы добавить к этому, если это возможно, что, когда я нажимаю кнопку «Тестировать в 1-м окне», появляется второе окно с записями / текстом / кнопкой и первое окно убивается?

То, как у меня сейчас получается, выдает ошибку, говоря, что «объект MySecondGUI не имеет атрибута« buttonPressed2 »

Помощь будет очень полезна.

Я вставил свой код ниже:

ФАЙЛ GUI_VIEW (gui_view.py)

import tkinter as tk

from tkinter import Tk


class MyMainGUI(tk.Frame):

    def __init__(self, controller):

       tk.Frame.__init__(self)
       self.pack()
       self.controller = controller

       self.Button1=tk.Button(self)
       self.Button1["text"]= "Test"
       self.Button1["command"]=self.controller.buttonPressed1
       self.Button1.grid(row=2,column=0,rowspan=2)


class MySecondGUI(tk.Toplevel):

       def __init__(self):

        tk.Toplevel.__init__(self)


        self.outputLabel2 = tk.Label(self)
        self.outputLabel2["text"] = ("Enter Value")
        self.outputLabel2.grid(row=5,rowspan=2)

        self.entrySpace2 = tk.Entry(self)
        self.entrySpace2.grid(row=8,column=0,rowspan=2)

        self.Button2=tk.Button(self)
        self.Button2["text"]= "Try Me"
        self.Button2["command"] = self.buttonPressed2
        self.Button2.grid(row=14,column=0,rowspan=2)enter code here

ФАЙЛ ГЛАВНОГО КОНТРОЛЛЕРА GUI

import tkinter as tk 

import gui_view # the VIEW file


class MainControl:

    def __init__(self):   
      self.root = tk.Tk()
      self.root.geometry('550x200')
      self.view = gui_view_temp.MyMainGUI(self)
      self.view.mainloop()

    def newWindow(self):

      self.viewNew = gui_view.MySecondGUI()
      self.viewNew.geometry('300x400')
      self.newDisplay = tk.Label(self.newWin, text='Test Mode')
      self.viewNew.mainloop()
      self.newDisplay.pack()

    def buttonPressed1(self):

         self.newWindow()

    def buttonPressed2(self):

         pass


if __name__ == "__main__":

    c = MainControl()

1 Ответ

0 голосов
/ 28 ноября 2018

1-я часть вашего вопроса

Ваша кнопка не появляется, потому что класс MySecondGUI также должен иметь доступ к основному корню ("controller").Измените конструктор MySecondGUI следующим образом:

def __init__(self, controller):

    tk.Toplevel.__init__(self)
    self.controller = controller  # Add controller too

    self.outputLabel2 = tk.Label(self)
    self.outputLabel2["text"] = ("Enter Value")
    self.outputLabel2.grid(row=5, rowspan=2)

    self.entrySpace2 = tk.Entry(self)
    self.entrySpace2.grid(row=8, column=0, rowspan=2)

    self.Button2 = tk.Button(self)
    self.Button2["text"] = "Try Me"
    # Button referenced to the controller
    self.Button2["command"] = self.controller.buttonPressed2
    self.Button2.grid(row=14, column=0, rowspan=2)

Затем вызовите его из основного класса как:

self.viewNew = gui_view.MySecondGUI(self)

2-я часть вашего вопроса

ОтносительноВаш второй вопрос: вы не можете убить главное окно, так как оно является корнем вашей программы (второй - просто виджет Toplevel).Вы можете скрыть это, используя следующую строку кода в начале функции newWindow:

self.root.withdraw()

Если вы хотите снова использовать корневое окно (вам следует), вы можете использовать deiconify метод:

self.root.deiconify()
...