1

我正在编写一个简单的程序来提取图像(BackgroundFinal.png)并将其显示在窗口中。我希望能够按窗口上的按钮将图片向下移动 22 个像素。一切正常,除了按钮不做任何事情。

import Tkinter
import Image, ImageTk
from Tkinter import Button


a = 0       #sets inital global 'a' and 'b' values
b = 0

def movedown():             #changes global 'b' value (adding 22)
    globals()[b] = 22
    return

def window():               #creates a window 
    window = Tkinter.Tk();
    window.geometry('704x528+100+100');

    image = Image.open('BackgroundFinal.png');      #gets image (also changes image size)
    image = image.resize((704, 528));
    imageFinal = ImageTk.PhotoImage(image);

    label = Tkinter.Label(window, image = imageFinal);   #creates label for image on window 
    label.pack();
    label.place(x = a, y = b);      #sets location of label/image using variables 'a' and 'b'

    buttonup = Button(window, text = 'down', width = 5, command = movedown()); #creates button which is runs movedown()
    buttonup.pack(side='bottom', padx = 5, pady = 5);

    window.mainloop();

window()

如果我没记错的话,按钮应该改变全局 'b' 值,从而改变标签的 y 位置。我真的很感激任何帮助,对不起我的糟糕的约定。提前致谢!

4

2 回答 2

5

你在这里有几个问题。

首先,您正在使用packand place。通常,您应该只在容器小部件中使用 1 个几何管理器。我不建议使用place. 你需要管理的工作太多了。

其次,您在movedown构建按钮时调用回调。那不是你想做的——你想传递函数,而不是函数的结果:

buttonup = Button(window, text = 'down', width = 5, command = movedown)

第三,globals返回当前命名空间的字典——其中不可能有整数键。要获取对 引用的对象的引用b,您需要globals()["b"]. 即使这样做了,更改b全局命名空间中的值也不会更改标签的位置,因为标签无法知道该更改。而且一般来说,如果你需要使用globals,你可能需要重新考虑你的设计。

这是一个简单的例子,说明我将如何做到这一点......

import Tkinter as tk

def window(root):
    buf_frame = tk.Frame(root,height=0)
    buf_frame.pack(side='top')
    label = tk.Label(root,text="Hello World")
    label.pack(side='top')
    def movedown():
        buf_frame.config(height=buf_frame['height']+22)

    button = tk.Button(root,text='Push',command=movedown)
    button.pack(side='top')

root = tk.Tk()
window(root)
root.mainloop()
于 2013-03-28T06:41:19.400 回答
4

感谢您的回复,但是,这并不是我真正想要的。我将在这里发布我发现对遇到同样问题的其他人最有效的内容。

本质上,在这种情况下,使用 Canvas 代替标签要好得多。使用画布,您可以使用 canvas.move 移动对象,这是一个简单的示例程序

# Python 2
from Tkinter import *

# For Python 3 use:
#from tkinter import *

root = Tk()
root.geometry('500x500+100+100')

image1 = PhotoImage(file = 'Image.gif')

canvas = Canvas(root, width = 500, height = 400, bg = 'white')
canvas.pack()
imageFinal = canvas.create_image(300, 300, image = image1)

def move():
    canvas.move(imageFinal, 0, 22)  
    canvas.update()

button = Button(text = 'move', height = 3, width = 10, command = move)
button.pack(side = 'bottom', padx = 5, pady = 5)

root.mainloop()

我的代码可能并不完美(对不起!),但这是基本思想。希望我能帮助其他人解决这个问题

于 2013-04-01T00:13:32.797 回答