2017-04-13 260 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 

东西线(对不起,我终于行了!)

这仅仅是一小段代码来演示如何使用宽度来创建以中间为中心的卡片,而不管卡片的数量有多少。你可能需要稍微鼓掌以获得它想要的。

我希望这会有所帮助,祝你好运!