Объедините два окна, где второе окно зависит от первого окна

Первое окно для количества прямоугольников. Он определяет количество полей ввода во втором окне. Я хочу создать окно с количеством прямоугольников, которые нужно ввести, и при нажатии кнопки отправки содержимое второго окна должно отображаться под количеством прямоугольников и кнопкой отправки, чтобы я мог видеть количество введенных прямоугольников. В основном, пытаясь сделать так, чтобы все отображалось только в одном окне. Примечание. Код можно проверить.

from tkinter import *

rectangle_values = []
k = 0

def open_window():
    window.withdraw()
    global k
    top = Toplevel()
    top.title("Rectangles")

    for i in range(0, int(rectangles.get()) * 2):
        if (i % 2) == 0:
            l4 = Label(top, text = "Size of rectangle:")
            l4.grid(row=i, column=0)
        en = Entry(top)
        en.grid(row=i, column=1)

    b4 = Button(top, text = "Back", width=12, command=lambda: (top.destroy(), window.deiconify()))
    b4.grid(row=int(rectangles.get()) * 2 + 1, column=1)
    k = int(rectangles.get())

window = Tk()

l3 = Label(window, text = "Number of Rectangles:")
l3.grid(row=0, column=0)

# defining entries
rectangles = StringVar()
e3 = Entry(window, textvariable=rectangles)
e3.grid(row=0, column=1)

# Defining buttons
b1 = Button(window, text='Submit', width=12, command=open_window)
b1.grid(row=3, column=1)

window.title("Rectangle Configuration")
window.mainloop()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать виджет Рамка, чтобы сделать все это в одном окне.

from tkinter import *

rectangle_values = []
k = 0

def open_window(rectangles):
    global k
    window.title('Rectangles')
    print(rectangles)
    for i in range(0, int(rectangles) * 2):
        if (i % 2) == 0:
            l4 = Label(frame2, text = "Size of rectangle:")
            l4.grid(row=i, column=0)
        en = Entry(frame2)
        en.grid(row=i, column=1)

    frame2.tkraise()

    b4 = Button(frame2, text = "Back", width=12, command=lambda: (frame1.tkraise(), window.title('Rectangle Configuration')))
    b4.grid(row=int(rectangles) * 2 + 1, column=1)
    k = int(rectangles)

window = Tk()

frame1 = Frame(window)
frame1.grid(row = 0, column = 0, sticky = 'nsew')
frame2 = Frame(window)
frame2.grid(row = 0, column = 0, sticky = 'nsew')

frame1.tkraise()

l3 = Label(frame1, text = "Number of Rectangles:")
l3.grid(row=0, column=0)

# defining entries
rectangles = StringVar()
e3 = Entry(frame1, textvariable=rectangles)
e3.grid(row=0, column=1)

# Defining buttons
b1 = Button(frame1, text='Submit', width=12, command=lambda: open_window(rectangles.get()))
b1.grid(row=3, column=1)

window.title("Rectangle Configuration")
window.mainloop()

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

Devin Maharjan 09.04.2019 09:38

@DevinMaharjan, вы все еще можете использовать виджет Frame. Просто расположите их одну под другой и покажите кадр2 после нажатия кнопки «Отправить».

FrainBr33z3 09.04.2019 10:00

Да, это сработало. Можем ли мы ограничить размер кадра и только полосу прокрутки?

Devin Maharjan 09.04.2019 10:34

@DevinMaharjan Чтобы ограничить размеры фреймов, взгляните на [effbot.org/tkinterbook/grid.htm] (менеджер сетки) (rowspan, columnspan, rowconfigure, columnconfigure и т. д.). Я не уверен, что вам нужно изменить с полосой прокрутки. Но, если это просто размещение, менеджер сетки должен быть тем, что вы ищете.

FrainBr33z3 09.04.2019 10:44

Можем ли мы собрать полосу прокрутки из всего окна вместе? Это имело бы больше смысла, чем просто для кадра. Можем ли мы это сделать?

Devin Maharjan 11.04.2019 16:22

@DevinMaharjan, к сожалению, корневое окно tkinter не поддерживает полосу прокрутки. Но вы можете добавить холст в корневое окно, а затем добавить два кадра поверх него (используя create_window на холсте). Затем вы можете сделать холст прокручиваемым.

FrainBr33z3 11.04.2019 17:26

Можем ли мы размещать графики с помощью create_window?

Devin Maharjan 12.04.2019 11:07
Ответ принят как подходящий

Вы можете поместить первое «окно» в рамку, а второе — в другое, а затем создать второе после проверки количества прямоугольников:

Примечание: Я добавил значение по умолчанию, чтобы проверка и пустая запись не вызывали ошибку, и сделал сброс второго кадра при проверке другой записи.

import tkinter as tk


class NumRectFrame(tk.Frame):

    def __init__(self, master):
        super().__init__(master)
        self.master = master
        self.label = tk.Label(self, text = "Number of Rectangles:")
        self.label.grid(row=0, column=0)

        self.num_rectangles = tk.IntVar()
        self.num_rectangles_entry = tk.Entry(self, textvariable=self.num_rectangles)
        self.num_rectangles_entry.grid(row=0, column=1)
        self.num_rectangles_entry.insert(tk.END, 0)

        self.btn = tk.Button(self, text='validate', 
                             command=lambda: self.master.get_num_rect(int(self.num_rectangles_entry.get())))
        self.btn.grid(row=1, column=1)


class RectFrame(tk.Frame):

    def __init__(self, master, num_rect=0):
        super().__init__(master)
        self.master = master
        self.num_rect = num_rect
        for idx in range(self.num_rect * 2):
            if idx % 2 == 0:
                tk.Label(self, text = "Size of rectangle:").grid(row=idx, column=0)
            tk.Entry(self).grid(row=idx, column=1)


class App(tk.Tk):

    def __init__(self):
        super().__init__()
        self.title('Num Rectangles')
        self.num_rect_fm = NumRectFrame(self)
        self.num_rect_fm.pack()

    def get_num_rect(self, val=0):
        try:
            self.rect_fm.destroy()
        except AttributeError:
            pass
        self.rect_fm = RectFrame(self, num_rect=val)
        self.rect_fm.pack()


app = App()
app.mainloop()

Другие вопросы по теме