Как создать функцию, которая заставляет кнопку перемещаться вниз при каждом нажатии? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь создать функцию, которая заставляет кнопку двигаться вниз при каждом нажатии.

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 голосов
/ 24 декабря 2018

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

Вот мой код, а затем ниже я объясню свой мыслительный процесс:

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 определены для больших программ, и для более крупных программ вам потребуется вести список объектов / массивов со значениями x, y и, возможно, z для всех ваших компонентов графического интерфейса.

Для вашей функции я правильно назвал ее (иногда я тоже дважды пишу с заглавной буквы, но качество кода важно, кашель "CLick") и включил глобальные переменные (что вы должны были сделать ранее с "b").В дополнение к добавлению правильной функциональности (button_y = button_y + 10) я также позаботился о том, чтобы кнопка не могла выходить за край экрана, поэтому всегда полезно определять размер окна с помощью переменных.

ДляОсновной код ничего не изменил, кроме имени функции и размера окна дополнений.

0 голосов
/ 24 декабря 2018

Вы можете сделать это, передав 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, то это другой вопрос ...

0 голосов
/ 24 декабря 2018

Вы сбрасываете n и m каждый раз, когда запускаете метод, поэтому после цикла 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...