2017-04-13 8 views
0

私は自分のバージョンのCrazy Eightsを作成しています。アプリの背後にあるすべてのロジックは問題ありませんが、私はキャンバスにカードを置くことに問題があります。実際には、自分のメインウィンドウ/キャンバス(800x800)に特定のサイズを設定すると、自分のアプリがうまく動作します。しかし、私は自分のアプリケーションが実行しているデバイスの画面サイズを取得し、メインウィンドウのサイズを変更したいと思っていました。水平方向と垂直方向に私のカードをTkinter - キャンバスで相対オフセットを使用して画像を整える

w, h = root.winfo_screenwidth(), root.winfo_screenheight() 
root.geometry("%dx%d+0+0" % (w, h)) 

すべてがこの時点までは結構ですが、その後、私は再びセンター(アライン)しようとしているいくつかのトラブルを持っている:私は、その次の行を追加することで実現しました。例:片手では、すべてのカードは絶対オフセット(x、700)を使用して配置されます。ここで、xは、カード間で距離を与えるために増加し、700は、y座標における位置である。しかし、絶対オフセットを使用するのは、ウィンドウサイズが固定されている場合のみです。したがって、私はrelyとrelx(配置ジオメトリ)のような相対オフセットを使いたいと思っていましたが、どうやってそれを行うのか分かりません。ここでは、何が起こったのか、私が望んでいるのかをあなたに知らせるためのイメージを掲載します。ここで

enter image description here

私のスクリプトされています。また、私は、クリックイベントの後に私のカード(揃える)再センターに関数を作成したい

import tkinter as tk 

class start_gui(tk.Frame): 
def __init__(self, parent, *args, **kwargs): 
    tk.Frame.__init__(self,parent, *args, **kwargs) 
    self.hand = dict() 
    # create canvas 
    self.w, self.h = parent.winfo_screenwidth(), parent.winfo_screenheight() 
    self.canvas = tk.Canvas(parent, width=self.w, height=self.h, background="red") 

    self.x = 280 
    self.playerHand = self.gethand() 
    # display for south 
    for Card in playerHand: 
     self.hand[(self.canvas.create_image(self.x, 700, image=self.getImage(Card[0], Card[1]), tags='p1'))] = [ 
      Card[0], Card[1], sel.x, 700] 
     self.x += 20 
     # print(str(Card.suit)) 

def gethand(self): 
    # here goes some script to get player card hand 
    # return a list of lists 

def getImage(self, num, suit): 
    # return image item 

if __name__ == "__main__": 
root = tk.Tk() 
w, h = root.winfo_screenwidth(), root.winfo_screenheight() 
root.geometry("%dx%d+0+0" % (w, h)) 
start_gui(root) 
root.mainloop() 

。あなたにアイデアを与えるために別のイメージを投稿します。 enter image description here

上記の画像から、1つの正方形をクリックすると、選択した四角はキャンバスの中央に配置され、他のカードはカード間の初期スペースを維持しながら水平に整列します。もう一度クリックすると、前のイベントが行われます。

誰かがこれを手伝ってくれますか?前もって感謝します。

答えて

0

あなたのウィンドウをデバイスの画面のサイズにすることに関しては、rootの属性機能を使ってフルスクリーンにし、キャンバスをウィンドウのサイズに合わせて拡張することをお勧めします。

これは次のようになります。これはどうなるのか

root = Tk() 
root.attributes("-fullscreen", True) #Makes the window fullscreen. 

... 

self.canvas = Canvas(self.root, bg="red", highlightthickness=0) 
    #Highlight thickness makes the canvas have no border in fullscreen mode. 
self.canvas.pack(fill=BOTH, expand=True) #Use pack to make canvas take up full window. 

をキャンバスに画面全体を取るようにすることです。 メインループを呼び出した後でも、root.update()を使っても、self.canvas.winfo_width()self.canvas.winfo_height()を使ってキャンバス/ウィンドウ(現在は同じ)のフルサイズを取得できます。

あなたが望むようにフルスクリーンキャンバスを使用すると、先に定義したスクリーン幅で正しい位置にカードを生成することができます。カードを表す変数、および各カード間のバッファサイズとして第二の可変演技で、あなたは

start_pos = screen_width/2 - (buffer_width*card_width)*num_of_cards/2 #Gets first x coord 
y_pos = [screen_height-card_height*2, screen_height-card_height]  #makes 2 y coords 
for i in range(num_of_cards): 
    self.canvas.create_rectangle(start_pos+(i*(card_width+buffer_width)), y_pos[0], start_pos+card_width+buffer_width+(i*(card_width+buffer_width)), y_pos[1], fill = card_colours[i]) #Make list of card colours in order 

の線に沿って何かを行うことができます(長い最後の行のために申し訳ありません!)

このいくつのカードがあるかにかかわらず、中央を中心にしてカードを作成するために幅を使用できる方法の1つを示す短いコードです。あなたはそれを手に入れたいと思うかもしれません。

私はこれが幸運に役立つことを願っています!

関連する問題