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

ここでいくつかの問題があります。

まず、 と を使用していpackますplace。一般に、コンテナ ウィジェット内でジオメトリ マネージャを 1 つだけ使用する必要があります。の使用はお勧めしませんplace。それは、あなたが管理しなければならない仕事が多すぎるということです。

movedown次に、ボタンを作成するときにコールバックを呼び出しています。それはあなたがやりたいことではありません-関数の結果ではなく、関数を渡したいのです:

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

3 番目に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.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 に答える