2017-09-18 25 views
0

私はPython TkinterでTic Tac Toeゲームを作っていますが、ボタンは長方形であり、すべて100x100ピクセルにします。ボタンのサイズをピクセル単位で変更するにはどうすればよいですか? (Tkinter)

a1 = Button(root, text="", font="Helvetica 16 bold", command=a1, height=10, width=10) 

(空の文字列とa1を無視)し、まだそれは正方形にサイズを変更しません:私は使用してみました。私はコードの大部分を書きましたが、フレームを使ってサイズを変更したくありません。私は何をすべきか?私は確信してボタンをピクセル単位で特定のサイズであることを確認したいと思う

+0

は、あなたが質問に記述するコードが掲載コードと一致しない(その多くは、質問に関連しないよう求めています)。 –

+0

このコードを[mcve]に減らしてください。たとえば、問題がウィジェットのサイズに関連している場合、すべてのコールバックは必要ありません。 –

+0

@ScottHunter不要なコードを削除する質問を編集しました。希望があれば –

答えて

0

方法は、フレームの内側にそのボタンを配置し、フレームが特定のサイズに設定され、ボタンはその枠を埋めるために設定されていることを確認することによってです。

これは、簡単にあなたのプログラムで動作するように変換することができ、それは確かボタンが正確に100×100

これは私がボタンのサイズを確認するのを認識しています唯一の方法であるに設定されていますピクセル単位。他にもオプションがあります。

まず、2つのリストが必要です。 1つはフレームを保持し、もう1つはボタンを保持する。これにより、フレームとボタンを簡単に保存して、後で作業することができます。

frames_list = [] 
btn_list = [] 

私はそれがリストで動作しますので、私はそれに若干の変更を行いますので、あなたのcheck_win()機能を凝縮する方法についての私の頭の上から確認していません。私たちは、後にforループを使用して作成されようとしているインデックス値を持つボタンのリストでその相手とそうでa1a2a3の各インスタンスを交換する必要がある、と。

def check_win(): 
    # Horizontal wins 
    if btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "X" or btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "O": 
     print("{} wins".format(btn_list[0]["text"])) 
    elif btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "X" or btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "O": 
     print("{} wins".format(btn_list[3]["text"])) 
    elif btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "X" or btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "O": 
     print("{} wins".format(btn_list[6]["text"])) 

    # Vertical wins 
    elif btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "X" or btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "O": 
     print("{} wins".format(btn_list[0]["text"])) 
    elif btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "X" or btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "O": 
     print("{} wins".format(btn_list[1]["text"])) 
    elif btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "X" or btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "O": 
     print("{} wins".format(btn_list[2]["text"])) 

    # Diagonal wins 
    elif btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "X" or btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "O": 
     print("{} wins".format(btn_list[0]["text"])) 
    elif btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "X" or btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "O": 
     print("{} wins".format(btn_list[2]["text"])) 

    # If no one wins 
    else: 
     change_turn() 

その後、我々はボタン、リスト内の各ボタンのインデックス値を含めるので、このようにそれに引数を追加するprocess_turn()機能を変更する必要があります。

def process_turn(ndex): # index argument being sent by buttons 
    btn_list[ndex].config(text=turn) # changed text at index of list. 
    check_win() 

最後に、我々は、コマンドに正しいインデックスを持つすべてのボタンを作成する必要があり、我々はのためのループでこれを行うことができます。まあ、2つのループです。

最初のループは行カウントを開始し、2番目のforループは列カウントを処理します。これにより、3×3グリッドが作成されます。 ndex変数は、各ボタンがボタンリストで設定する必要があるインデックスを追跡するために使用されます。

def create_frames_and_buttons(): 
    ndex = 0 
    i = 0 
    x = 0 
    for i in range(3): 
     for x in range(3): 
      frames_list.append(Frame(root, width = 100, height = 100)) 
      frames_list[ndex].propagate(False) 
      frames_list[ndex].grid(row = i, column = x, sticky = "nsew", padx = 2, pady = 2) # add any padding you would like to space out the frames/buttons 
      btn_list.append(Button(frames_list[ndex], text="", font="Helvetica 16 bold", 
        command = lambda ndex=ndex: process_turn(ndex))) 
      btn_list[ndex].pack(expand=True, fill=BOTH) 
      x += 1 
      ndex += 1 
     i += 1 
    root.resizable(width=False, height=False) 

create_frames_and_buttons() 

あなたが望む正確な100x100ピクセルサイジングを持つこのコードをまとめています。

は、以下の例を見てみましょう:

from tkinter import * 

root = Tk() 
frames_list = [] 
btn_list = [] 

turn = "X" 
turnLabel = Label(root, text=turn, font="Helvetica 16 bold") 
turnLabel.grid(row=3, columnspan=3) 

def change_turn(): 
    global turn 
    if turn == "O": 
     turn = "X" 
     turnLabel.config(text=turn) 
    elif turn == "X": 
     turn = "O" 
     turnLabel.config(text=turn) 

def check_win(): 
    # Horizontal wins 
    if btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "X" or btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "O": 
     print("{} wins".format(btn_list[0]["text"])) 
    elif btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "X" or btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "O": 
     print("{} wins".format(btn_list[3]["text"])) 
    elif btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "X" or btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "O": 
     print("{} wins".format(btn_list[6]["text"])) 

    # Vertical wins 
    elif btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "X" or btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "O": 
     print("{} wins".format(btn_list[0]["text"])) 
    elif btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "X" or btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "O": 
     print("{} wins".format(btn_list[1]["text"])) 
    elif btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "X" or btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "O": 
     print("{} wins".format(btn_list[2]["text"])) 

    # Diagonal wins 
    elif btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "X" or btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "O": 
     print("{} wins".format(btn_list[0]["text"])) 
    elif btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "X" or btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "O": 
     print("{} wins".format(btn_list[2]["text"])) 

    # If no one wins 
    else: 
     change_turn() 

def process_turn(ndex): 
    btn_list[ndex].config(text=turn) 
    check_win() 

def create_frames_and_buttons(): 
    ndex = 0 
    i = 0 
    x = 0 
    for i in range(3): 
     for x in range(3): 
      frames_list.append(Frame(root, width = 100, height = 100)) 
      frames_list[ndex].propagate(False) 
      frames_list[ndex].grid(row = i, column = x, sticky = "nsew", padx = 2, pady = 2) 
      btn_list.append(Button(frames_list[ndex], text="", font="Helvetica 16 bold", 
        command = lambda ndex=ndex: process_turn(ndex))) 
      btn_list[ndex].pack(expand=True, fill=BOTH) 
      x += 1 
      ndex += 1 
     i += 1 
    root.resizable(width=False, height=False) 

create_frames_and_buttons() 

root.mainloop() 

結果:

enter image description here

+0

_「これは、ピクセル単位のボタンのサイズを確認するために私が知っている唯一の方法です。」 - 多くの方法があります。 Frame + pack_propagate(0)を使用するか、 'place'を使うかキャンバス上にイメージオブジェクトを作成するか、ボタンに幅と高さをピクセルとして解釈させる不可視の1x1ピクセルイメージを与えることができます。 –

+1

@BryanOakley私が知っている唯一の方法は...私は他のオプションについてはわかりません。イメージングにはピクセルサイズを調整するいくつかの方法がありますが、フレームは私が慣れ親しんだ唯一のものです。他の選択肢があるかもしれないことを明確にするために私の答えを更新しました。 –

1

一つの簡単な方法は、ボタンを不可視1x1ピクセルのイメージを与えることです。あなたがいることを行うと、widthheight属性は、ピクセル(またはより正確にまたポイント、インチ、またはセンチメートルを意味することができ、画面単位、)として解釈されています。

compoundを値 "c"に設定すると、テキストとイメージの両方が表示され、両方がウィンドウの中央に表示されます。例えば

import Tkinter as tk 
... 
pixel = tk.PhotoImage(width=1, height=1) 
button = tk.Button(root, text="", image=pixel, width=100, height=100, compound="c") 
... 
+0

PhotoImageはイメージを作成せずにイメージを作成できますか? –

+0

@SierraMountainTech:はい。 –

+0

テキストが ""でなければ正方形のボタンを得るために、 'padx = 0、pady = 0'オプションを追加しなければなりませんでした。 –

関連する問題