Создание нового окна при нажатии кнопки в существующем окне в Tkinter - PullRequest
0 голосов
/ 28 ноября 2018

У меня проблемы с графическим интерфейсом Tkinter.Мне нужно создать большое приложение.Мне нужно использовать классы для этого, чтобы управлять всеми модулями вместе.Для проверки модуля и получения справки здесь я попытался предоставить пример, близкий к точной проблеме (с небольшим примером) здесь:

Я создаю 1-е окно с кнопкой, помеченной как «Тест»,Что я хочу, так это то, что когда я нажимаю кнопку «Тест», появляется новое второе окно с текстом «Введите значение» и полем ввода, где я могу ввести значение.Я предоставил код ниже.Происходит то, что я могу получить новое окно, но текст «Введите значение» и поле ввода генерируется в первом окне вместо второго, а второе окно остается пустым.Я не понимаю, где я делаю неправильный логический вызов.Помощь будет очень ценится.

Я знаю, что нам не нужны классы для приложений с графическим интерфейсом, однако для управления моим большим приложением (не показано здесь) мне нужны классы, и я буду очень признателен, если какой-то Tkinter Guru может помочьменя с ошибкой в ​​моем коде.

Просмотр файла GUI (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.Frame):

       def __init__(self, controller):

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

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

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


### gui Controller File (gui_controller.py)

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.MyMainGUI(self)
        self.view.mainloop()

    def newWindow(self):

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

    def buttonPressed1(self):

         self.newWindow()

if __name__ == "__main__":

    c = MainControl()
#

ДОБАВЛЕНИЕ ИЗМЕНЕННОГО КОДА С НОВОЙ ПРОБЛЕМОЙ.

Теперь я могу создать код, который открывает новое окно с записями, когда я нажимаю кнопку «Тест» в первом окне.Однако у меня возникают проблемы при создании кнопок в окне Scond. То, как у меня сейчас получается, выдает ошибку, говоря: «Объект MySecondGUI не имеет атрибута« buttonPressed2 »

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

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

ФАЙЛ GUI_VIEW (gui_view.py)

import tkinter as tk

изtkinter import Tk

класс 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)

класс 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

импорт tkinter as tk

импорт gui_view # файл VIEW

класс 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

если имя == " main ":

c = MainControl()

1 Ответ

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

в MySecondGUI (tk.Frame):

def __init__(self, controller):
    #Attach your frame to "secondGUI" (which is your second window)
    tk.Frame.__init__(self, controller) 

в классе MainControl:

#I assume you're passing your parent window/frame as "controller"?
self.viewNew = MySecondGUI(self.newWin)

в соответствии с Python Tkinter Docs

https://docs.python.org/3.5/library/tkinter.html#mapping-basic-tk-into-tkinter

Вам следует указать родительское окно, если вы не прикрепляете свой виджет к главному окну.

#Main window
root = tk.Tk()
#Second Window
newWin = tk.Toplevel(root)

#Attach to main window
tk.Label(text="This label attached to root").pack()
tk.Button(text="This button attached to root").pack()

#Second Window
tk.Label(newWin, text="This label attached to second window").pack()
tk.Button(newWin, text="This button attached to second window").pack()

также,

self.viewNew.mainloop()
#This will fail because you have to set everything up before mainloop()
#_tkinter.TclError: can't invoke "pack" command: application has been destroyed
self.newDisplay.pack()

Редактировать для обновления

Вы должны поместить свой

def buttonPressed2(self):

в класс MySecondGUI, а не в класс MainControl.

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 means "MySecondGUI" not "MainControl" here
        self.Button2["command"] = self.buttonPressed2
        self.Button2.grid(row=14,column=0,rowspan=2)

      def buttonPressed2(self):
          pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...