2016-12-03 62 views
-1

我想在python3中使用tkinter代碼一個非常簡單的遊戲。這是一個連續的遊戲,玩了很多時間。我的問題是,在一段時間結束時,點擊「下一個時間段」按鈕時,下一個時間段不會加載。這裏是我的代碼:幀沒有加載tkinter

import tkinter as tk 
from tkinter import ttk 

class Game(tk.Tk): 

    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 

     container = tk.Frame(self) 
     container.pack(side='top', fill='both', expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     F=Period 
     frame = F(container, self) 
     self.frames[F] = frame 
     frame.grid(row=0, column=0, sticky='nsew') 

    def show_frame(self, cont): 

     frame = self.frames[cont] 
     frame.tkraise() 

class Period(tk.Frame): 

    def __init__(self, parent, controller): 

     tk.Frame.__init__(self, parent) 

     firstOffer = 5 

     labelOffer = tk.Label(self, anchor='center', text=str(firstOffer)) 
     labelOffer.place(anchor='center', relx=0.6, rely=0.5) 

     buttonAcc = ttk.Button(self, text='Accept', command=lambda: self.PeriodSummary(parent, controller)) 
     buttonAcc.place(anchor='center', relx=0.35, rely=0.5)   

    def PeriodSummary(self, parent, controller): 

     buttonNextPeriod = ttk.Button(self, text='Next Period', command=lambda: controller.show_frame(Period)) 
     buttonNextPeriod.place(anchor='center', relx=0.5, rely=0.75, width=200, height=80)   

app = Game() 
app.wm_state('zoomed') 
app.mainloop() 
當用戶點擊「下一步週期」運行代碼時

可以看出,沒有任何反應。我希望它開始一個新的時期。我相信我對Python中的對象編程編程有不正確的理解。任何指針將不勝感激,謝謝。

+0

你做了什麼來調試呢?你是否證實了'show_frame'方法被調用?如果您刪除'lambda'並使用自定義函數,則更容易。然後,您可以更輕鬆地添加打印功能或使用調試器停止。 –

+0

謝謝@BryanOakley。我只是做了你的建議(在'show_frame'函數中增加了一個'print'語句,事實上'show_frame'沒有被調用,但是我不明白爲什麼在點擊按鈕時不會調用它。 – splinter

+0

爲了複製這個問題,你真的需要numpy嗎?如果不是,你需要將它壓縮成不依賴於numpy的東西。 –

回答

1

與上面的評論相反,將print(self.frames)放入show_frame的內部表示show_frame被調用。由於self.frames只有一個項目,{<class '__main__.Period'>: <__main__.Period object .!frame.!period>},並且單個期間對象已經可見,所以.tkraise公開了已經公開的內容並且沒有可見的更改。有兩種方法可以增加活力。

簡單的選項:使一個週期幀,暴露它,並有Next按鈕更改內容。如果可能的話可以這樣做。

更難的選擇:一次或根據需要製作多個週期幀。每個人都有明顯不同的內容。公開第一個。然後讓按鈕暴露下一個。有兩個子選項:在eacy其他頂部堆疊相同大小的網格(或打包或放置)框架,並提出你想要看到的一個;或者只是將你想要看到的那個格子化,在開關時沒有進行網格劃分。如果您需要重新展示之前看到的幀,我只會使用多幀路由。如果您需要,可以使用標籤框架小部件(例如ttk.Notebook)來處理堆疊和暴露給您。一個例子是一個窗口可以填充多個表單,每個窗體可以有多種用途。一個特定的例子是IDLE的標籤式配置對話框。

+0

謝謝@TerryJanReady。我不需要重新公開先前看到的框架,我只想要按順序查看時段,一次該按鈕已被c舔。在我的代碼中,「下一步」按鈕確實指的是時間段,所以我不明白爲什麼沒有顯示新的時間段。我可以創建Period2,Period3等類。但這並不優雅,必須有一個更簡單的方法。 – splinter

+0

我會在一篇新文章中以更好的方式提出這個問題。 – splinter