Python

Tkinter виджеты неправильно выводятся

 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".
ЮС
Юрий Сатюков
14 368
Лучший ответ
В коде есть ошибка в методе `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.