2017-09-12 13 views
0

私はPythonスキル、特にOOPを開発するためにカードゲーム(モンスターマスターと呼ばれる)を作っています。Pythonのtkinterボタンが表示されない

私はいくつかの静的オブジェクトを持つGUIを持っています。プレーヤ1のテーブルの側、プレーヤ2の側、真ん中の細い線、そして私は現在「終了ターン」ボタンを実装しようとしています。

このボタンを表示させるためにさまざまなことを試みましたが、エラーがなくても表示されません。ただ、このボタンで問題を理解しようとするために一時的に取り除いたコメントがいくつかあります。

ここで私は現在しようとするために使用しているコードです:

def RunGame(): 
class App(): 
    """docstring for App""" 

    def draw(): 
     # Setting up canvas dimensions 

     canvas_width = 640 
     canvas_height = 480 

     master = Toplevel() 
     master.title("Monster Master by Charles Cameron - Game") 
     master.resizable(width=False, height=False) 
     master.geometry("640x480") 

     w = Canvas(master, 
        width=canvas_width, 
        height=canvas_height) 
     w.pack() 

     # Drawing static objects 
     CentrePoints = [(0, canvas_height/2), (canvas_width/2, canvas_height/2), 
      (canvas_width, canvas_height/2)] 
      #Left, centre and right centres (save me from retyping them) 

     Player1Area = w.create_rectangle(CentrePoints[0], canvas_width, 
      canvas_height, fill="#303AFE") #Player1 Area 
     Player2Area = w.create_rectangle(0, 0, CentrePoints[2], 
      fill="#C31B1B") #Player2 Area 

     Barrier = w.create_line(CentrePoints[0], CentrePoints[2], 
      fill="#0090E3", width=20) # Centre barrier 

     # class GameBtn(): 
     # class EndTurnBtn(): 
     #  def __init__(self, BtnName, master): 
     BtnName = Button(master, bg="white", command=lambda:print("Clicked!")) 

     image = ImageTk.PhotoImage(file="imgs\EndTurn.png") 
     BtnName.config(image=image, width="70", height="70") 

     BtnName.pack(side=RIGHT) 

     # ChangeTurn = GameBtn.EndTurnBtn('ChangeTurn', master) 

     master.mainloop() 

Window = App() 
App.draw() 

実際のボタンのボタンのコードは、私が独自のスクリプトでそれをしようとしたときにうまく働いたが、私は、このプログラムの中に置く際に動作を停止に。

尋ねるのはあまりにも愚かではない、パイソンではかなりアマチュアであり、正直に答えはどこでもオンラインで見つけることはできません。

感謝

+0

- あなたの '' image''のvaraibleたら範囲外になると、ボタンは空白になります。ページ下部の注 - http://effbot.org/tkinterbook/photoimage.htm –

+0

ルートウィンドウと新しいウィンドウの両方を実際に使用するつもりでない限り、TopLevelは使用しないでください。私はあなたのコードには他の問題もあると思います(例えばImageTKは何ですか?) –

答えて

2

あなたのボタンが存在しますが、それは、ウィンドウの端を超えます。これは、ウィンドウを640x480にして、それを640x480のキャンバスで完全に埋め込んだからです。 master.geometry("640x480")行を削除すると、キャンバスとボタンの両方を含むようにウィンドウが伸びます。

「ボタンをキャンバスの横に表示したくないのですが、ボタンをキャンバスにしたいのですが、キャンバスは本当に存在します。 "キャンバスにウィジェットを埋め込むには、create_windowHow to place a widget in a Canvas widget in Tkinter?を参照)を使用することができますが、フレームオブジェクトを積み重ねて個々の色を付けることで、色付きの背景を作成するほうが現実的かもしれません。例:

from tkinter import Tk, Frame, Button 

root = Tk() 
root.geometry("640x480") 
top_player_frame = Frame(root, height=230, bg="red") 
barrier = Frame(root, height=20, bg="green") 
bottom_player_frame = Frame(root, height = 230, bg="blue") 

#configure column 0 so frames can stretch to fit width of window 
root.columnconfigure(0, weight=1) 

top_player_frame.grid(row=0, sticky="we") 
barrier.grid(row=1, sticky="we") 
bottom_player_frame.grid(row=2, sticky="we") 

bottom_player_end_turn_button = Button(bottom_player_frame, text="End Turn") 
#use `place` here because `pack` or `grid` will collapse the frame to be only as tall as all the widgets it contains, i.e. just this button 
bottom_player_end_turn_button.place(x=10,y=10) 

root.mainloop() 

結果:

enter image description here

あなたはまた、Tkinterのは、オブジェクトへの参照を保持していないとして、あなたの光画像オブジェクトはそのままとどまることを確認する必要があり
+0

私はボタンを画像にしていた問題を解決してくれていないのですが、返事をいただきありがとうございます。私はTkImageや写真イメージを使用しようとしていましたが、画像パラメータとして渡しても問題はありませんでした。 – MrMeowMeow

+0

@MrMeowMeow、[PhotoImage早すぎるガベージコレクションのバグ](http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm)が原因である可能性があります。そのページに記載されている修正が役に立たない場合は、イメージボタンの問題を説明する新しい投稿を作成することを検討してください。 – Kevin

関連する問題