как создать n текстовых виджетов tkinter после ввода пользователем значения n - PullRequest
0 голосов
/ 01 августа 2020

Я хочу взять n образцов текста через n текстовое поле, где n берется у пользователя. когда я запускаю код, вводимый пользователем 3, должно появиться окно с 3 текстовыми полями, как этого добиться?

мой код

#I have imported all necessary modules 
n = input("enter number of text boxes")
root1 = Tk()
root1.title("replacement text")
root1.geometry("+300+200")
textbox = list()
for i in range(n):
    textbox.append(Text(root1, height = 1, width = 57, wrap = None ))
    textbox[i].insert(INSERT,"text" +str(i) )
root1.mainloop() 

это не работает Пожалуйста, помогите, спасибо

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Вы все делаете правильно, и все, что вам нужно сделать, это использовать любой из менеджеров геометрии , чтобы разместить текстовый виджет в окне. Кроме того, вы не принимаете ввод как целое число, по умолчанию любой ввод - это str, чтобы преобразовать его в целое число, вам нужно сделать int(input(...).

Полный код:

from tkinter import *

n = int(input("Enter number of text boxes: "))
root1 = Tk()
root1.title("replacement text")
root1.geometry("+300+200")
textbox = list()
for i in range(n):
    textbox.append(Text(root1, height = 1, width = 57, wrap = None ))
    textbox[i].insert(INSERT,"text" +str(i) )
    textbox[i].pack()

root1.mainloop() 
0 голосов
/ 01 августа 2020

Я действительно создал что-то подобное!

class NewWindowWithNControls:

def __init__(self, number_of_controls):
    self.root = Toplevel()

    windowWidth = self.root.master.winfo_reqwidth()
    windowHeight = self.root.master.winfo_reqheight()

    # Gets both half the screen width/height and window width/height
    positionRight = int(self.root.winfo_screenwidth() / 2 - windowWidth / 2)
    positionDown = int(self.root.winfo_screenheight() / 2 - windowHeight / 2)

    y_pad = "3"
    self.rows = 0

    self.root.geometry("+%s+%s" % (positionRight, positionDown - 200))
    self.root.title("Plan From File")
    self.root.configure(background=menu_background_color)

    self.input_data_list= list()

    for i in range(int(number_of_controls)):
        data_input_dict = dict()

        data_input_dict ['data_header_key'] = Entry(self.root)
        data_input_dict ['data_header_key'].configure(background=entry_box_background,
                                            foreground=text_color,
                                            width=25)
        data_input_dict ['data_header_key'].grid(row=self.rows, column=0, sticky='w', pady=y_pad)
        data_input_dict ['data_header_key'].bind('<Control-a>', select_text)
        data_input_dict ['data_header_key'].insert(0, '')

        self.rows += 1

        self.input_data_list.append(data_input_dict )

По сути, он создает словарь для каждой серии элементов управления (если вы хотите также несколько текстовых полей в одной строке, если вам нужно только вы один, вы можете пропустить часть словаря и просто удерживать ее в списке), а затем сохраните ее в списке, который содержит всю информацию для всех n элементов управления, позже вы получите доступ к этому списку, чтобы получить ввод из текстовых полей

В родительском окне вы создаете что-то вроде этого:

    self.number_of_controls_entry = Entry(self.root)
    self.number_of_controls_entry.configure(background=entry_box_background,
                                 foreground=text_color,
                                            width=8)

    self.number_of_controls_entry.grid(row=self.rows, column=1, sticky='e')
    self.number_of_controls_entry.bind('<Control-a>', select_text)
    self.number_of_controls_entry.insert(0, '')

    self.rows += 1

    self.apply_btn = Button(self.root)
    self.apply_btn.configure(background=widget_background_color, foreground=text_color, width=10)
    self.apply_btn.grid(row=self.rows, column=0, pady=15, padx=30, columnspan=2, sticky='nsew')
    self.apply_btn.configure(text='''Apply''')
    self.apply_btn.configure(command=lambda: self.apply_changes(self.number_of_controls_entry.get()))

def apply_changes(self, number_of_controls):
    self.root.destroy()
    NewWindowWithNControls(number_of_controls)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...