Как удалить строки в Tkinter? - PullRequest
0 голосов
/ 02 мая 2018

Очень плохо знакомы с Python и Tkinter.

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

Заранее спасибо!

Пример кода:

import Tkinter as tk
from Tkinter import *
root = tk.Tk()

def input_count():
    try:
        user_submission=int(user_text.get())
    except:
        wrong_submission=tk.Label(root,  text="That isn't a number, try again!", justify = tk.LEFT, padx = 20)
        wrong_submission.grid(column=0 , row=1)
    else:
        for num in range(0,user_submission):
            old_row=2
            new_row=old_row+(2*num)
            extra_new_row= new_row + 1
            animal_check=tk.Label(root,  text='Enter an animal', justify = tk.LEFT, padx = 20)
            animal_check.grid(column=0 , row=new_row)
            animal_text = Entry(root, width= 50)
            animal_text.grid(column=1, row=new_row)
            colour_check=tk.Label(root,  text='Enter a colour', justify = tk.LEFT, padx = 20)
            colour_check.grid(column=0 , row=extra_new_row)
            colour_text = Entry(root, width= 50)
            colour_text.grid(column=1, row=extra_new_row)



user_label=tk.Label(root, text='Enter a number', justify = tk.LEFT, padx = 20)
user_label.grid(column=0 , row=0)
user_text= Entry(root, width= 50)
user_text.grid(column=1, row=0)
user_submit=Button(root,text="SUBMIT", command=input_count)
user_submit.grid(column=2,row=0)
root.mainloop()

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вам нужно создать контейнер, чтобы сохранить ссылку на ваши строки. Чтобы все было аккуратно, давайте поместим все компоненты строки в класс. Тогда у нас может быть метод destroy(), который уничтожает всю строку, и метод get(), который получает результат из строки. Мы создадим глобальный список с именем «current_rows», в котором будут храниться все строки, которые отображаются в данный момент. Мы можем добавить в этот список, чтобы добавить строки, и удалить из этого списка, чтобы удалить строки.

import Tkinter as tk
from tkMessageBox import showerror

class Mgene:
    def __init__(self, master):
        columns, rows = master.grid_size()
        self.animal_check=tk.Label(master,  text='Enter an animal', justify = tk.LEFT, padx = 20)
        self.animal_check.grid(column=0 , row=rows)
        self.animal_text = tk.Entry(master, width= 50)
        self.animal_text.grid(column=1, row=rows)
        self.colour_check=tk.Label(master,  text='Enter a colour', justify = tk.LEFT, padx = 20)
        self.colour_check.grid(column=0 , row=rows+1)
        self.colour_text = tk.Entry(master, width= 50)
        self.colour_text.grid(column=1, row=rows+1)

    def destroy(self):
        self.animal_check.destroy()
        self.animal_text.destroy()
        self.colour_check.destroy()
        self.colour_text.destroy()

    def get(self):
        return self.animal_text.get(), self.colour_text.get()

current_rows = []
def input_count():
    try:
        user_submission=int(user_text.get())
    except:
        showerror("Error", "That isn't a number, try again!")
    else:
        # add any rows needed
        for num in range(len(current_rows)-1, user_submission):
            current_rows.append(Mgene(root))

        # remove any rows needed
        while len(current_rows) > user_submission:
            current_rows.pop().destroy()

def get_answers():
    for row in current_rows:
        print row.get()

root = tk.Tk()

user_label=tk.Label(root, text='Enter a number', justify = tk.LEFT, padx = 20)
user_label.grid(column=0 , row=0)
user_text= tk.Entry(root, width= 50)
user_text.grid(column=1, row=0)
user_submit=tk.Button(root,text="SUBMIT", command=input_count)
user_submit.grid(column=2,row=0)
user_get=tk.Button(root,text="print answers", command=get_answers)
user_get.grid(column=2,row=1)
root.mainloop()

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

0 голосов
/ 02 мая 2018

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

import os, sys
from Tkinter import *


root = tk.Tk()

def input_count():
    try:
        user_submission=int(user_text.get())
    except:
        wrong_submission=tk.Label(frame_top,  text="That isn't a number, try again!", justify = tk.LEFT, padx = 20)
        wrong_submission.grid(column=0 , row=1)
    else:
        try:
            frame_bottom.grid_forget()
        except:
            pass
        frame_bottom = tk.Frame(root)
        frame_bottom.grid(row = 2, column = 0, sticky = "nsew")
        for num in range(0,user_submission):
            old_row=2
            new_row=old_row+(2*num)
            extra_new_row= new_row + 1
            animal_check=tk.Label(frame_bottom, text='Enter an animal', justify = tk.LEFT, padx = 20)
            animal_check.grid(column=0, row=new_row)
            animal_text = Entry(frame_bottom, width= 50)
            animal_text.grid(column=1, row=new_row)
            colour_check=tk.Label(frame_bottom,  text='Enter a colour', justify = tk.LEFT, padx = 20)
            colour_check.grid(column=0, row=extra_new_row)
            colour_text = Entry(frame_bottom, width= 50)
            colour_text.grid(column=1, row=extra_new_row)

frame_top = tk.Frame(root)
frame_top.grid(row = 0, column = 0, sticky = "nsew")

frame_bottom = tk.Frame(root)
frame_bottom.grid(row = 2, column = 0, sticky = "nsew")

user_label=tk.Label(frame_top, text='Enter a number', justify = tk.LEFT, padx = 20)
user_label.grid(column=0 , row=0)
user_text= Entry(frame_top, width= 50)
user_text.grid(column=1, row=0)
user_submit=Button(frame_top,text="SUBMIT", command=input_count)
user_submit.grid(column=2,row=0)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...