2017-10-18 151 views
-1

2つのウィンドウを作成しようとしています。 1つはランダムなイメージを表示し、もう1つは新しいランダムイメージに変更するボタンを持っています。現在、Display.update_image()にタイマーを置き、Display.__init__で呼び出すと、定期的に画像を変更することができます。Tkinter親から子ウィンドウを変更する

ただし、親ウィンドウのボタンにupdate_image()コマンドを入力しても機能しません。最初のウィンドウから2番目のウィンドウを変更することは可能ですか?

import tkinter as tk 
from PIL import Image, ImageTk 
import random 


def top_100(): 
    """ 
    Returns a list of the top 100 biggest NZ cities. 
    """ 
    file = open("Top100NZcities.csv") 
    cities = file.readlines() 
    return [city.strip() for city in cities] 


class UserInt(): 
    def __init__(self): 
     self.root = tk.Tk() 
     self.newWindow = tk.Toplevel(self.root) 
     self.app = Display(self.newWindow) 

     self.random_100_button = tk.Button(text = 'Random from top 100', 
              width = 50, 
              command = self.app.update_image())  
     self.random_100_button.pack() 
     self.root.mainloop() 


class Display(): 
    def __init__(self, master): 
     self.root = master 

     #Get the list of cities,. 
     self.cities = top_100() 

     #Set to fullscreen. 
     w, h = self.root.winfo_screenwidth(), self.root.winfo_screenheight() 
     self.root.overrideredirect(1) 
     self.root.geometry("%dx%d+0+0" % (w, h))   

     #Display initial image. 
     self.image_init = ImageTk.PhotoImage(Image.open("black_background.jpg")) 
     self.panel = tk.Label(self.root, image=self.image_init) 
     self.display = self.image_init 
     self.panel.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES) 

    def update_image(self): 
     """ 
     Replaces the screen's current image with a new random image. 
     """ 
     self.city = random.choice(self.cities) 
     self.image_rand = Image.open("NZ maps/{}_nz.png".format(self.city)) 

     #Rescale image to fit window. 
     w, h = self.root.winfo_screenwidth(), self.root.winfo_screenheight()   
     self.scale_factor = h/self.image_rand.height 
     self.scaled_image = self.image_rand.resize(
      (int(self.scale_factor * self.image_rand.width), h), Image.ANTIALIAS 
     ) 
     self.image_display = ImageTk.PhotoImage(self.scaled_image) 
     self.panel.configure(image=self.image_display) 
     print(self.city) 
     self.display = self.image_display 


def main(): 
    app = UserInt() 


if __name__ == '__main__': 
    main() 
+0

「機能しません」とはどういう意味ですか?プログラムはクラッシュしますか?間違いはありますか?それは間違ったイメージを表示しますか?画像が間違った場所に表示されますか? ... –

+0

'command = self.app.update_image()'は、 'update_image()' RIGHT NOWを呼び出し、ボタンがクリックされたときに実行される関数としてその戻り値(None)を保存することを意味します。かっこを取り除いて、その結果ではなく実際の関数を渡しています。 – jasonharper

+0

関数を 'command'として渡すことになっています。 – Goyo

答えて

0

上記のコメントには、jasonharperが指摘しているとおりです。あなたが関数を実行し、commandNoneの値を代入しているself.app.update_image()等しくする属性commandを設定

 self.random_100_button = tk.Button(text = 'Random from top 100', width = 50, command = self.app.update_image()) 

問題は、この行から来ています。

宣言から括弧()を削除すると、関数自体の値がcommandに割り当てられているため、関数の戻り値ではないため、問題を解決する必要があります。

関連する問題