Python tkinter - клонирование свойств корневого окна и применение их к окнам верхнего уровня - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу создать несколько почти одинаковых окон без копирования / вставки всех свойств окна в каждой функции.

def child_window():
    childwindow.geometry("400x800")

def window_one():
    childwindow = Toplevel(root)
    childwindow.title("title window one")
    child_window()

def window_two():
    childwindow = Toplevel(root)
    childwindow.title("title window two")
    child_window()

Код не работает, так как дочернее окно не принимает свойство геометрии из общей функции child_window.Есть ли какой-нибудь возможный способ скопировать дизайн во все окна, не помещая весь код в каждую функцию.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Если вы передаете объект Toplevel в функцию child_window, вы можете использовать этот объект для прямой установки геометрии этого окна Toplevel (также, пожалуйста, не используйте повторно имена переменных):

def child_window(window):
    window.geometry("400x800")

def window_one():
    childwindow = Toplevel(root)
    childwindow.title("title window one")
    child_window(childwindow)

def window_two():
    childwindow = Toplevel(root)
    childwindow.title("title window two")
    child_window(childwindow)
0 голосов
/ 06 декабря 2018

Я согласен с fhdrsdg в его решении, но я бы изменил одну вещь.Вместо функции, содержащей одно установленное значение для размера, пусть эта функция сначала проверяет размер корневого окна, а затем применяет тот же размер к окну верхнего уровня.

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

Как это:

import tkinter as tk

def child_window(window):
    window.geometry("{}x{}".format(root.winfo_width(), root.winfo_height()))

def window_one():
    childwindow = tk.Toplevel(root)
    childwindow.title("title window one")
    child_window(childwindow)

def window_two():
    childwindow = tk.Toplevel(root)
    childwindow.title("title window two")
    child_window(childwindow)

root = tk.Tk()
root.geometry("500x300")
# I added this delay due to an issue tkinter has with reading the root size before the mainloop has had a change to fully load the root window.
root.after(1000, window_one)
root.after(1000, window_two)

root.mainloop()

Для подхода ООП см. Этот пример:

import tkinter as tk


class Example(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("500x300")
        self.after(1000, self.window_one)
        self.after(1000, self.window_two)

    def child_window(self, window):
        print("{}x{}".format(self.winfo_width(), self.winfo_height()))
        window.geometry("{}x{}".format(self.winfo_width(), self.winfo_height()))

    def window_one(self):
        childwindow = tk.Toplevel(self)
        childwindow.title("title window one")
        self.child_window(childwindow)

    def window_two(self):
        childwindow = tk.Toplevel(self)
        childwindow.title("title window two")
        self.child_window(childwindow)

if __name__ == "__main__":
    Example().mainloop()
0 голосов
/ 06 декабря 2018

Ваш код излишне повторяется и завершается с ошибкой DRY-код участника , вот решение, которое устраняет проблему и следует принципалу.

from tkinter import *
from tkinter.ttk import *

def main():
    root = Tk()

    tops = list()
    for i in range(2):
        tops.append(same_top(root, 'title window ' + str(i)))

    mainloop()


def same_top(root, toptitle):
    child = Toplevel(root)
    child.title(toptitle)
    child.geometry("400x800")

    return child


if __name__ == '__main__':
    main()

Ваша проблема в том, что ваша дочерняя функция выполняетне знаю, кто такой childwindow, если вы передадите childwindow геометрической функции, то это сработает.

Ваш код исправлен:

from tkinter import *
from tkinter.ttk import *

def main():
    root = Tk()

    window_one(root)
    window_two(root)

    mainloop()


def child_window(childwindow):
    childwindow.geometry("400x800")

def window_one(root):
    childwindow = Toplevel(root)
    childwindow.title("title window one")
    child_window(childwindow)

def window_two(root):
    childwindow = Toplevel(root)
    childwindow.title("title window two")
    child_window(childwindow)


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...