【问题标题】:How to create back button on tkinter/or delete all widgets on canvas?如何在 tkinter 上创建后退按钮/或删除画布上的所有小部件?
【发布时间】:2018-10-01 18:29:33
【问题描述】:
from Tkinter import *  
import Tkinter as ttk  
from ttk import *  
master = Tk()
master.title("Learn Spanish")

canvas = Canvas(master, width = 600, height = 600, bg = 'orange')  
canvas.grid(row=0, column=0, rowspan=2, columnspan=2) 

title = canvas.create_text(300, 100, text = 'Learn To Speak Spanish', font = ('Freestyle Script', 60), fill = 'firebrick')  
text = canvas.create_text(300, 250, text = 'Welcome! What are you ready \n   to learn Spanish today?', font = ('Freestyle Script', 35), fill = 'firebrick')

def nextScreen():  
    canvas.delete("all")

    canvas.create_text(300, 125, text = 'Select one of the activities below to get started.', font = ('Freestyle Script', 30), fill = 'firebrick')

    btn4 = ttk.Button(master, bg='white', command=wordStudy, text='Word Study', font=('Freestyle Script', 35))
    canvas.create_window(300, 300, width=300, height=90, window=btn4)
    btn5 = ttk.Button(master, bg='white', command=matchGame, text='Matching Game', font=('Freestyle Script', 35))
    canvas.create_window(300, 400, width=300, height=90, window=btn5)
    btn6 = ttk.Button(master, bg='white', command=quiz, text='Quiz Yourself', font=('Freestyle Script', 35))
    canvas.create_window(300, 500, width=300, height=90, window=btn6)


def quiz():
    canvas.delete("all") # haven't worked on this one yet

def matchGame():
    canvas.delete("all") # haven't worked on this one yet either

def wordStudy(): #i'm right here
    canvas.delete("all")
    Canvas(master, width = 600, height = 600, bg = 'orange')
    canvas.create_text(300, 50, text = 'Study the terms below.', font = ('Freestyle Script', 30), fill = 'firebrick')

    btn = ttk.Button(master, bg='white', command=back, text='Back', font=('Freestyle Script', 15))
    canvas.create_window(100, 575, width=40, height=20, window=btn)



    def textvariable(text): # translation of english pop up when buttons pressed
        entry.delete(0,END)
        entry.insert(0,text)
        return

    b1=Button(canvas, text="Good morning.", command=lambda:textvariable("Buenos dias.")).grid(row=1, column=1, pady=(100,50), padx=100)
    b2=Button(canvas, text="Good night.", command=lambda:textvariable("Buenas noches.")).grid(row=1, column=2, pady=(100,50), padx=100)
    b3=Button(canvas, text="Goodbye.", command=lambda:textvariable("Adiós.")).grid(row=2, column=1, pady=50, padx=100)
    b4=Button(canvas, text="Hello.", command=lambda:textvariable("Hola.")).grid(row=2, column=2, pady=50, padx=100)
    b5=Button(canvas, text="What is your name?", command=lambda:textvariable("¿Cómo te llamas?")).grid(row=3, column=1, pady=50, padx=100)
    b6=Button(canvas, text="How are you?", command=lambda:textvariable("¿Cómo estás?")).grid(row=3, column=2, pady=50, padx=100)
    b7=Button(canvas, text="Please.", command=lambda:textvariable("Por favor.")).grid(row=4, column=1, pady=50, padx=100)
    b8=Button(canvas, text="Thank you.", command=lambda:textvariable("Gracias.")).grid(row=4, column=2, pady=50, padx=100)


    entry = Entry(canvas, textvariable=textvariable, width=30)  
    entry.grid(column=2, row=8, padx=10, pady=(10, 50))

    canvas.create_text(295, 570, text = 'Translation:', font = ('Freestyle Script', 25), fill = 'firebrick')


btnStart = ttk.Button(master, bg='white', command=nextScreen, text='Start', font=('Freestyle Script', 35))
canvas.create_window(295, 400, width=400, height=90, window=btnStart)

def back():  # i'm not sure how to make back button or make this work!
    canvas.delete("all")


mainloop() 

我正在开发一个西班牙语应用程序。我想知道如何有效地创建后退按钮或删除画布上的所有内容,包括小部件。我看到一些帖子创建了一个类,并使用 self.等等,但我不熟悉所有这些东西。我是初学者。

【问题讨论】:

  • ttktkinter 中的另一组功能。要使用它们(尽管您的代码中没有),请使用:from tkinter import ttk
  • 请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。

标签: python button canvas tkinter widget


【解决方案1】:

在第一页中,您将小部件放置在画布上:

canvas.create_window(..., window=btn)

在 wordStudy 中你正在使用网格:

b1=Button(canvas, text=... )).grid(row=1,... 

要删除放置在网格中的小部件,请使用以下任一方法:

b1.grid_remove()
b1.grid_forget()

我不记得确切的区别,所以你必须谷歌它。

对评论的回应

当您在函数nextScreen() 中从画布中删除所有窗口时, 它可以工作,因为画布是在主脚本中定义的。根据规则 名称范围一个函数将使用来自 main 的变量,如果它们不是 在函数内部定义。由于画布是可变的,您可以更改它 没有宣布它是全球性的。

按钮 b1-b8 在函数 wordStudy() 中创建,并且 引用(名称:b1、b2 等)在 函数退出。为了宣布它们全局工作,它们必须是 在函数外的主脚本中创建;全球所有 语句所做的是将主脚本中的变量包含到 功能范围。

我建议您使用相同的方法将小部件放在 整个脚本中的函数nextScreen() 中的画布,因为它 工作得很好。代码也更容易阅读和维护,如果你 始终以相同的方式解决相同的任务。

如果你想尝试grid_forget(),这里有一些例子 玩的代码。做的时候一定要注意 范围。

from tkinter import *

root = Tk()
root.geometry('200x100')
field = Canvas(root, bg='white')
field.pack(expand='yes', fill='both')

def start_function(event=None): 
    print('Start button pressed.')

start_button = Button(field, text='start', command=start_function)
start_button.grid(row=0, column=0) # Place the button on the canvas

def remove_button(event=None): # Forget the button
    start_button.grid_forget()

def show_button(event=None):   # Remember the button
    start_button.grid()

root.bind('a', remove_button)  # Press "a" on the keyboard to forget
root.bind('s', show_button)    # Press "s" on the keyboard to remember

【讨论】:

  • 非常感谢您的回复!对此,我真的非常感激!但是,我添加了您建议的代码,但并没有删除按钮。相反,我收到一条错误消息,提示“未定义全局名称 b1”。我什至把'global b1'放在你建议的代码之前。
  • 我在答案中添加了一些进一步的解释。
  • 我能够删除所有小部件!非常感谢您的帮助!!!!!!!
  • 如果您认为我的回答对您有帮助,请善待并接受我的回答。 :)
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
相关资源
最近更新 更多