from tkinter import *
class Window(Tk):
def __init__(self):
super().__init__()
self.count = 0
self.labels = []
self.widgets = []
def TextValue(self, text: str, value: str):
self.labels += [Label(text = text, font = "Arial 18")]
self.labels[-1].master = self
self.labels[-1].grid(row = self.count, column = 0)
self.widgets += [Entry(font = "Arial 18")]
self.widgets[-1].master = self
self.widgets[-1].insert(0, value)
self.labels[-1].grid(row = self.count, column = 1)
self.count += 1
win = Tk()
win.title("Окно 1")
root = Window()
root.title("Окно 2")
win.bind("", lambda event: root.TextValue("label text", "entry text"))
Label и Entry должны быть отображены в Окне 2.
Однако выводиться только Label, и то в Окне 1.
В чём ошибка в коде?
В коде есть несколько проблем, которые мешают виджетам `Label` и `Entry` отображаться в "Окне 2".
1. В методе `TextValue`, вы случайно присваиваете `grid()` методу `Label` вместо `Entry`, что приводит к тому, что `Entry` не отображается.
2. Вы создаете два экземпляра класса `Tk`, что может привести к непредсказуемому поведению, так как каждое окно `Tk` должно быть отдельным корневым окном приложения.
Для исправления этих проблем, следует внести следующие изменения:
```python
from tkinter import *
class Window(Toplevel): # Изменяем класс Window на Toplevel
def __init__(self, master=None): # Добавляем параметр master
super().__init__(master)
self.count = 0
self.labels = []
self.widgets = []
def TextValue(self, text: str, value: str):
self.labels += [Label(self, text=text, font="Arial 18")] # Используем self в качестве родительского окна для Label
self.labels[-1].grid(row=self.count, column=0)
self.widgets += [Entry(self, font="Arial 18")] # Используем self в качестве родительского окна для Entry
self.widgets[-1].insert(0, value)
self.widgets[-1].grid(row=self.count, column=1)
self.count += 1
win = Tk()
win.title("Окно 1")
root = Window(win) # Передаем win как родительское окно для Window
root.title("Окно 2")
win.bind("<ButtonPress-3>", lambda event: root.TextValue("label text", "entry text"))
win.mainloop() # Запускаем основной цикл обработки событий для окна win
```
Теперь `Label` и `Entry` будут корректно отображаться в "Окне 2". Также мы изменили класс `Window` на `Toplevel`, чтобы сделать его подокном для окна `win`, что позволит нам отображать его в "Окне 2".
В коде есть ошибка в методе `TextValue`. Вы пытаетесь разместить оба виджета `Label` и `Entry` на одной и той же ячейке сетки, и из-за этого только `Label` отображается. Один из виджетов будет перекрывать другой.
Чтобы исправить это, вам нужно изменить размещение виджетов на разные ячейки сетки. Вот исправленный метод `TextValue`:
```python
def TextValue(self, text: str, value: str):
self.labels += [Label(text=text, font="Arial 18")]
self.labels[-1].master = self
self.labels[-1].grid(row=self.count, column=0)
self.widgets += [Entry(font="Arial 18")]
self.widgets[-1].master = self
self.widgets[-1].insert(0, value)
self.widgets[-1].grid(row=self.count, column=1)
self.count += 1
```
Теперь `Label` и `Entry` будут отображаться в разных ячейках сетки, и вы должны увидеть оба виджета в Окне 2.
Также, обратите внимание, что вы создаете два экземпляра класса `Tk`: `win` и `root`. Это не рекомендуется, так как каждый экземпляр `Tk` создает свое собственное главное окно приложения. Вам следует использовать только один экземпляр `Tk` в вашем приложении, и для второго окна вы можете использовать класс `Toplevel`. Вот исправленный код с использованием `Toplevel`:
```python
from tkinter import *
class Window(Toplevel):
def __init__(self, master=None):
super().__init__(master)
self.count = 0
self.labels = []
self.widgets = []
self.title("Окно 2")
def TextValue(self, text: str, value: str):
self.labels.append(Label(self, text=text, font="Arial 18"))
self.labels[-1].grid(row=self.count, column=0)
self.widgets.append(Entry(self, font="Arial 18"))
self.widgets[-1].insert(0, value)
self.widgets[-1].grid(row=self.count, column=1)
self.count += 1
win = Tk()
win.title("Окно 1")
root = Window(win)
win.bind("<ButtonPress-3>", lambda event: root.TextValue("label text", "entry text"))
win.mainloop()
```
Теперь у вас должно работать два окна, и виджеты `Label` и `Entry` будут отображаться в Окне 2.