2017-04-13 31 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座標中的位置。但是,使用絕對偏移僅在窗口大小固定時才起作用。因此,我想使用像rel和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() 

另外,我想創建一個函數click事件後重新中心(調整)我的卡。我張貼另一張圖片給你一個想法。 enter image description here

從上圖中,如果我們點擊一​​個正方形。選定的方塊將放置在畫布中間,其他卡將水平對齊,以保持卡片之間的初始空間。如果我們再次點擊鼠標,上一個事件將會發生,依此類推。

有人可以幫助我嗎?先謝謝你。

回答

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. 

這是什麼會做的是讓你的畫布佔滿整個屏幕。 通過使用self.canvas.winfo_width()self.canvas.winfo_height(),在調用主循環或使用root.update()之後,您可以獲得畫布/窗口的全部大小(現在相同)。

現在您可以根據需要使用全屏畫布,您可以使用前面定義的屏幕寬度在正確的位置進行卡片生成。具有可變表示用卡,和第二個變量充當各卡之間的緩衝區大小,你可以做沿着

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 

東西線(對不起,我終於行了!)

這僅僅是一小段代碼來演示如何使用寬度來創建以中間爲中心的卡片,而不管卡片的數量有多少。你可能需要稍微鼓掌以獲得它想要的。

我希望這會有所幫助,祝你好運!