2013-03-28 4 views
0

Я пишу простую программу, которая подтягивает изображение (BackgroundFinal.png) и отображает его в окне. Я хочу, чтобы нажимать кнопку в окне, чтобы сдвинуть изображение на 22 пикселя. Все работает, за исключением того, что кнопка ничего не делает.Изменить положение метки в окне Tkinter

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» значение, поэтому изменение у позиции метки. Я очень ценю любую помощь, извините за мои ужасные уговоры. Заранее спасибо!

ответ

2

Спасибо за ответ, но это было не совсем то, что я искал. Я опубликую то, что нашел лучше всего для кого-то другого с той же проблемой.

По существу, в этом случае гораздо лучше использовать холст вместо метки. С холстов, вы можете перемещать объекты с 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() 

мой код не может быть совершенным (извините!), Но это основная идея. Надеюсь, я помогу кому-нибудь еще с этой проблемой

4

У вас здесь есть несколько проблем.

Во-первых, вы используете pack и place. В общем, вы должны использовать только один менеджер геометрии внутри виджета контейнера. Я не рекомендую использовать 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() 
Смежные вопросы