2010-02-14 12 views
15

Tôi đang cố gắng xóa tiện ích Entry sau khi người dùng nhấn một nút bằng Tkinter.Làm thế nào để xóa tiện ích Entry sau khi nhấn một nút trong Tkinter?

Tôi đã thử sử dụng ent.delete(0, END), nhưng tôi gặp lỗi khi nói rằng các chuỗi không có thuộc tính xóa.

Đây là mã của tôi, nơi tôi nhận được lỗi trên real.delete(0, END):

secret = randrange(1,100) 
print(secret) 
def res(real, secret): 
    if secret==eval(real): 
     showinfo(message='that is right!') 
    real.delete(0, END) 

def guess(): 
    ge = Tk() 
    ge.title('guessing game') 

    Label(ge, text="what is your guess:").pack(side=TOP) 

    ent = Entry(ge) 
    ent.pack(side=TOP) 

    btn=Button(ge, text="Enter", command=lambda: res(ent.get(),secret)) 
    btn.pack(side=LEFT) 

    ge.mainloop() 

Trả lời

26

Sau khi chọc xung quanh một chút qua Introduction to Tkinter, tôi đã đưa ra các mã dưới đây, mà không làm bất cứ điều gì ngoại trừ hiển thị một trường văn bản và rõ ràng nó khi nút "Clear text" được đẩy:

import tkinter as tk 

class App(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self, master, height=42, width=42) 
     self.entry = tk.Entry(self) 
     self.entry.focus() 
     self.entry.pack() 
     self.clear_button = tk.Button(self, text="Clear text", command=self.clear_text) 
     self.clear_button.pack() 

    def clear_text(self): 
     self.entry.delete(0, 'end') 

def main(): 
    root = tk.Tk() 
    App(root).pack(expand=True, fill='both') 
    root.mainloop() 

if __name__ == "__main__": 
    main() 
+1

Bạn có thể cung cấp đối số END (hoặc "end") thay vì tính toán độ dài của dữ liệu. Vì bạn nói nó không hoạt động nhưng không định nghĩa "không hoạt động" (ví dụ: bạn có gặp lỗi hay không âm thầm thất bại?), Tôi đoán bạn đã sử dụng "END" không đủ điều kiện. Hãy thử "Tkinter.END" để thay thế. Khi tôi sử dụng nó trong đoạn mã trên nó hoạt động tốt. –

+0

@Bryan: Ah, tôi chỉ sử dụng END chứ không phải Tkinter.END (hướng dẫn sử dụng 'from ... import' thay vì chỉ nhập). Cảm ơn! Bản sửa lỗi nằm trong mã. – GreenMatt

+0

Tôi muốn nút thực hiện 2 tác vụ cùng một lúc. đầu tiên là để thực hiện một hành động ngẫu nhiên và thứ hai là để xóa các mục nhập – Dan

2

Tôi không rõ ràng về câu hỏi của bạn. Từ http://effbot.org/tkinterbook/entry.htm#patterns, nó có vẻ như bạn chỉ cần thực hiện một bài tập sau khi bạn gọi là xóa. Để thêm văn bản nhập vào tiện ích, hãy sử dụng phương thức chèn. Để thay thế văn bản hiện tại, bạn có thể gọi xóa trước khi chèn văn bản mới.

e = Entry(master) 
e.pack() 

e.delete(0, END) 
e.insert(0, "") 

Bạn có thể đăng thêm một chút mã không?

+0

Câu trả lời "có vẻ như bạn chỉ cần làm một bài tập sau khi bạn gọi là xóa" không có cách nào trả lời câu hỏi "làm thế nào để xóa các widget nhập". –

+0

Điều này đã giúp tôi rất nhiều: e.delete (0, END), cảm ơn Charles. –

4

real nhận giá trị ent.get() chỉ là một chuỗi. Nó không có ý tưởng nó đến từ đâu, và không có cách nào để ảnh hưởng đến các widget.

Thay vì real.delete(), gọi .delete() trên widget vào bản thân:

def res(ent, real, secret): 
    if secret == eval(real): 
     showinfo(message='that is right!') 
    ent.delete(0, END) 

def guess(): 
    ... 
    btn = Button(ge, text="Enter", command=lambda: res(ent, ent.get(), secret)) 
5

ent.delete(0, END) là câu trả lời đúng, giả định rằng ent là một tài liệu tham khảo thích hợp để các phụ tùng nhập cảnh. Nếu bạn gặp lỗi bạn nói, bạn có lỗi trong mã của mình. Bạn sẽ cần hiển thị mã cho chúng tôi nếu bạn không thể tự phát hiện ra lỗi.

-6

Hãy thử với điều này:

import os 
os.system('clear') 
+1

xin vui lòng xem xét thêm ifo tối thiểu để hiểu mã –

+3

Không, điều này hoàn toàn sẽ không hoạt động. Thao tác này sẽ xóa màn hình chứ không phải tiện ích trong cửa sổ. –

+0

Điều này không liên quan gì đến câu hỏi. – cpburnz

0

Trước hết, hãy chắc chắn các văn bản được kích hoạt, sau đó xóa các thẻ của bạn, và sau đó là nội dung.

myText.config(state=NORMAL) 
myText.tag_delete ("myTags") 
myText.delete(1.0, END) 

Khi văn bản "DISABLE", thao tác xóa không hoạt động vì trường Văn bản ở chế độ chỉ đọc.

0

Bạn phải tiến hành ent.delete(0,"end") thay vì sử dụng 'END', sử dụng 'kết thúc' bên trong báo giá.

secret = randrange(1,100) 
print(secret) 
def res(real, secret): 
    if secret==eval(real): 
     showinfo(message='that is right!') 
    real.delete(0, END) 

def guess(): 
    ge = Tk() 
    ge.title('guessing game') 

    Label(ge, text="what is your guess:").pack(side=TOP) 

    ent = Entry(ge) 
    ent.pack(side=TOP) 

    btn=Button(ge, text="Enter", command=lambda: res(ent.get(),secret)) 
    btn.pack(side=LEFT) 

    ge.mainloop() 

này sẽ giải quyết vấn đề của bạn