如何创建一个使按钮每次单击都向下移动的函数?

时间:2018-12-23 21:37:09

标签: python tkinter

我正在尝试创建一个函数,使它在每次单击时都向下移动。

from tkinter import *

root = Tk()

def move_Button_Down_After_Each_CLick():
    b.place_forget()
    n=0
    m=0
    while n<=10:
        n+=1
        m+=5
        b.place(x= 10, y = 10+m)

b = Button(root, text="Delete me",  command=move_Button_Down_After_Each_CLick)
b.place(x = 0, y = 0)
root.mainloop()

3 个答案:

答案 0 :(得分:0)

每次运行该方法时,您将重置nm,因此在while循环之后,它们总是以相同的值结束。您必须在函数之外声明它们,以便可以在每次调用函数时将它们添加到(单击)。实际上,我不太确定为什么在此函数中根本没有两个变量和一个循环。我相信您要尝试做的就是这个。

from tkinter import *
root = Tk()

n = 0
def move_Button_Down_After_Each_CLick():
    global n
    b.place_forget()  
    moveDist = 5  #Distance button will move down on each click
    n += moveDist
    b.place(x = 0, y = n)

b = Button(root, text="Delete me",  command=move_Button_Down_After_Each_CLick)
b.place(x = 0, y = 0)
root.mainloop()

答案 1 :(得分:0)

您的代码井井有条,您对我们当前的想法一无所知。除此之外,将按钮向下移动的功能几乎没有意义,需要完全重写,我很想知道为什么您认为循环对于实现目标是必要的。我并不是说这些事情是刻薄或劝阻您,而只是为了强调您代码当前质量的重要性。没有适当的组织和计划,构建一个比这大得多的程序将非常困难。

这是我的代码,然后在下面我将解释我的思考过程:

from tkinter import *

#Definitions
window_w = 300
window_h = 200
button_x = 0
button_y = 0

#Functions
def move_button_down():
    global button_x, button_y, b

    if (button_y < window_h - 50):
        button_y = button_y + 10

    b.place_forget()        
    b.place(x = button_x, y = button_y)

#Main Code
root = Tk()
size = str(window_w) + "x" + str(window_h)
root.geometry(size)
root.resizable(1, 0)

b = Button(root, text="Delete me",  command=move_button_down)
b.place(x = button_x, y = button_y)
root.mainloop()

首先,我首先将您的代码分成几部分,以使其清晰易读,然后定义重要变量以帮助保持代码的组织性和模块化。通过在变量中定义窗口的宽度和高度,我们可以在代码中使用它,并且我还为您的窗口添加了在禁用水平调整大小的情况下开始调整大小的功能(如果您想知道如何启用/禁用这两种功能,则不能使用垂直调整大小) 。按钮的x和y位置已定义到大型程序,对于大型程序,您将希望维护一个包含所有GUI组件的x,y和z值的对象​​/数组的列表。

对于您的函数,我都正确地命名了它(有时我也会大写两次,但是代码质量很重要,咳嗽“ CLick”咳嗽)并包括了全局变量(您之前应该用“ b”表示)。除了添加正确的功能(button_y = button_y + 10)之外,我还确保按钮不会脱离屏幕边缘,这就是使用变量定义窗口大小总是很好的原因。

对于主代码,除了函数的名称和窗口大小的增加以外,没有什么改变。

答案 2 :(得分:0)

您可以通过将Button传递给函数并让函数使用该函数来确定其当前位置来实现。

这是我的意思:

import tkinter as tk

def move_button_down_after_each_click(button):
    # Get the current position.
    current_x = int(button.place_info()['x'])
    current_y = int(button.place_info()['y'])
    # Move the widget.
    button.place(x=current_x, y=current_y+10)

root = tk.Tk()
b = tk.Button(root, text="Delete me",
              command=lambda: move_button_down_after_each_click(b))
b.place(x=0, y=0)

root.mainloop()

请注意,我没有将while循环留在函数外,因为不需要移动按钮。如果您想为Button的运动设置动画,那么这是一个不同的问题...