Первое окно для количества прямоугольников. Он определяет количество полей ввода во втором окне. Я хочу создать окно с количеством прямоугольников, которые нужно ввести, и при нажатии кнопки отправки содержимое второго окна должно отображаться под количеством прямоугольников и кнопкой отправки, чтобы я мог видеть количество введенных прямоугольников. В основном, пытаясь сделать так, чтобы все отображалось только в одном окне. Примечание. Код можно проверить.
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()
Вы можете использовать виджет Рамка, чтобы сделать все это в одном окне.
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()
@DevinMaharjan, вы все еще можете использовать виджет Frame. Просто расположите их одну под другой и покажите кадр2 после нажатия кнопки «Отправить».
Да, это сработало. Можем ли мы ограничить размер кадра и только полосу прокрутки?
@DevinMaharjan Чтобы ограничить размеры фреймов, взгляните на [effbot.org/tkinterbook/grid.htm] (менеджер сетки) (rowspan, columnspan, rowconfigure, columnconfigure и т. д.). Я не уверен, что вам нужно изменить с полосой прокрутки. Но, если это просто размещение, менеджер сетки должен быть тем, что вы ищете.
Можем ли мы собрать полосу прокрутки из всего окна вместе? Это имело бы больше смысла, чем просто для кадра. Можем ли мы это сделать?
@DevinMaharjan, к сожалению, корневое окно tkinter не поддерживает полосу прокрутки. Но вы можете добавить холст в корневое окно, а затем добавить два кадра поверх него (используя create_window
на холсте). Затем вы можете сделать холст прокручиваемым.
Можем ли мы размещать графики с помощью create_window?
Вы можете поместить первое «окно» в рамку, а второе — в другое, а затем создать второе после проверки количества прямоугольников:
Примечание: Я добавил значение по умолчанию, чтобы проверка и пустая запись не вызывали ошибку, и сделал сброс второго кадра при проверке другой записи.
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()
Извините, если мой вопрос не был ясен. Но я хочу, чтобы количество прямоугольников, кнопка отправки и размеры прямоугольников отображались под ними.