Несколько окон в Python, tkinter

avatar
Zuckerpapa
13 мая 2021 в 21:14
101
1
1

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

import tkinter as tk
from tkinter import *

def debugWindow():
    dbWin = tk.Tk()
    dbWin.title("Debug")
    btn = tk.Button(text="Test")
    btn.pack()
    dbWin.mainloop()

window = tk.Tk()
window.title("Mainwindow")
btn2 = tk.Button(text="Start debug Window", command=debugWindow)
btn2.pack()
window.mainloop()

Вот что я пробовал, но, как я уже сказал, вторая кнопка отображается в первом окне. Также я новичок в Python, поэтому, если вы обычно это делаете не так, пожалуйста, поправьте меня. Я все еще учусь :) И еще прошу прощения за свой английский, я не носитель языка.

Источник
jasonharper
13 мая 2021 в 21:26
0

Вы хотите использовать Toplevel() для этого второго окна - второй вызов Tk() дает вам второе окно, но оно находится в совершенно отдельной среде графического интерфейса, которая не может взаимодействовать с исходной средой. Чтобы поместить виджеты в определенное окно (или другой контейнер), передайте его в качестве первого параметра виджету.

TheLizzard
13 мая 2021 в 21:30
0

@Zuckerpapa Как сказал @ jsonharper, измените btn = tk.Button(text="Test") на btn = tk.Button(dbWin, text="Test"), чтобы указать tkinter, что главное окно btn должно быть вторым окном (в противном случае предполагается, что первое окно является главным).

Ответы (1)

avatar
TheHappyBee
13 мая 2021 в 21:34
2

Если вы хотите, чтобы кнопка оставалась в окне с именем dbWin, тогда вместо использования:

btn = tk.Button(text="Test")

какой python предполагает, что кнопка должна перейти в главное окно, использование:

btn = tk.Button(dbWin, text="Test")

При использовании этого параметра будет специально назначен второй параметр, что позволит вашей кнопке перейти в окно dbWin

(кредит тем, кто сказал это до меня в комментариях)

TheLizzard
13 мая 2021 в 21:37
1

Разве это не то, что мы с @jasonharper говорили в комментариях?

Bryan Oakley
13 мая 2021 в 21:48
0

@TheLizzard: если вы хотите получить признание за ответ, вам нужно написать ответ, а не комментарий. Не вините кого-то еще за создание ответа, который содержит ту же информацию, что и комментарий. В этом конкретном случае вы не знаете, получили ли они ответ из вашего комментария или они просто знали ответ и отправили его.

TheLizzard
13 мая 2021 в 21:52
0

@BryanOakley Учитывая, что прошло 8 минут после того, как jasonharper опубликовал комментарий, неправильно принимать полную ответственность за ответ. Возможно, DavidLiu потребовалось 8 минут, чтобы решить проблему и ввести ответ, но я не думаю, что это вероятно. Я считаю, что нужно отдавать должное. Это нормально, если вы не согласны со мной, но я все равно постараюсь отдать должное, где это необходимо

Bryan Oakley
13 мая 2021 в 21:56
0

@TheLizzard: Нет ничего плохого в том, что кто-то пишет правильный ответ, совпадающий с вашим комментарием. Если вы хотите получить признание, напишите ответ, а не комментарий. Да, они должны отдать должное, но вы не должны автоматически предполагать, что они скопировали ваш комментарий. Вы обвиняете их без каких-либо доказательств.

TheLizzard
13 мая 2021 в 21:59
0

@BryanOakley Я не думаю, что это совпадение, учитывая, что это было через 8 минут и 25 секунд после того, как jasonharper написал этот комментарий. Я решил, что писать свой собственный ответ будет нечестно по отношению к jasonharper, поскольку он сначала обнаружил проблему в коде OP. Нет возможности получить доказательства, поэтому я использую вероятности.