Python 3.x Python 3.3-无法将按钮和标签与tkinter对齐

Python 3.x Python 3.3-无法将按钮和标签与tkinter对齐,python-3.x,tkinter,Python 3.x,Tkinter,我在用tkinter创建的python PONG游戏gui中对齐按钮和标签时遇到问题。我一直在寻找如何做到这一点的答案,但没有找到解决我问题的方法 我想做的是让按钮不都叠在一起。我希望左侧玩家的分数与屏幕左侧对齐,右侧玩家的分数与屏幕右侧对齐,并且能够理解如何将其他按钮移动到我想要的位置 我尝试过的事情: anchor = "..." justify = "..." grid(row="...", column = "...") 任何帮助都将不胜感激。我不知道如何解决这个问题 我想知道这是否与

我在用tkinter创建的python PONG游戏gui中对齐按钮和标签时遇到问题。我一直在寻找如何做到这一点的答案,但没有找到解决我问题的方法

我想做的是让按钮不都叠在一起。我希望左侧玩家的分数与屏幕左侧对齐,右侧玩家的分数与屏幕右侧对齐,并且能够理解如何将其他按钮移动到我想要的位置

我尝试过的事情:

anchor = "..."
justify = "..."
grid(row="...", column = "...")
任何帮助都将不胜感激。我不知道如何解决这个问题

我想知道这是否与我同时使用画布和按钮有关

以下是我的完整程序代码:

#PONG Game

from tkinter import *
import random
#http://www.tutorialspoint.com/python/tk_anchors.htm
#Globals
ball_x1 = 480
ball_x2 = 520
ball_y1 = 280
ball_y2 = 320

left_paddle_x1 = 0
left_paddle_x2 = 20
left_paddle_y1 = 240
left_paddle_y2 = 360

right_paddle_x1 = 980
right_paddle_x2 = 1000
right_paddle_y1 = 240
right_paddle_y2 = 360

left_player_score = 0
right_player_score = 0

paused = False

ball_x_motion = 10#random.randrange(-20, 20) #actually need to make a set number but random direction
ball_y_motion = 10#random.randrange(-20, 20)

def start():
    global paused
    if(field.coords(ball)[0] == 480):
        paused = False
        ball_movement()
    else:
        new_game(False)


def pause():
    global paused
    if(paused):
        paused = False
    else:
        paused = True
    ball_movement()
def new_game(reset):        
    global ball_x1, ball_x2, ball_y1, ball_y2, left_paddle_x1, left_paddle_x2, left_paddle_y1, left_paddle_yw
    global right_paddle_x1, right_paddle_x2, right_paddle_y1, right_paddle_y2
    global paused, left_player_score, right_player_score
    print("here1")
    if(reset):
        left_player_score = 0
        right_player_score = 0
        print("here")
        left_player_score_label.config(text=left_player_score)
        right_player_score_label.config(text=right_player_score)

        left_paddle_x1 = 0
        left_paddle_x2 = 20
        left_paddle_y1 = 240
        left_paddle_y2 = 360

        right_paddle_x1 = 980
        right_paddle_x2 = 1000
        right_paddle_y1 = 240
        right_paddle_y2 = 360

        field.coords(left_paddle, left_paddle_x1,  left_paddle_y1, left_paddle_x2, left_paddle_y2)
        field.coords(right_paddle, right_paddle_x1,  right_paddle_y1, right_paddle_x2, right_paddle_y2)

        paused = True
    print("here2")
    #starting positions
    ball_x1 = 480
    ball_x2 = 520
    ball_y1 = 280
    ball_y2 = 320


    field.coords(ball, ball_x1, ball_y1, ball_x2, ball_y2)



#Event Handlers

def ball_movement():
    #while(variable = true) move ball
    # move the object
    global ball_x_motion, ball_y_motion, ball_x1, ball_x2, ball_y1, ball_y2, paused
    global left_player_score, right_player_score

        #keep ball on playing field horizontally if ball hits paddles

    print(((((left_paddle_y1 + left_paddle_y2)/2) - ((ball_y1 + ball_y2)/2))))
    if(((ball_x1 <= 20) and (-60 <= ((((left_paddle_y1 + left_paddle_y2)/2) - ((ball_y1 + ball_y2)/2))) <= 60)) or ((ball_x2 >= 980) and (-60 <= ((((right_paddle_y1 + right_paddle_y2)/2) - ((ball_y1 + ball_y2)/2))) <= 60))):
        ball_x_motion = -ball_x_motion
        #increase speed
    elif(ball_x1 <=0):
        right_player_score += 1
        new_game(False)
        #paused = True
        right_player_score_label.config(text=right_player_score)
    elif(ball_x2 >= 1000):
        left_player_score += 1
        new_game(False)
        #paused = True
        left_player_score_label.config(text=left_player_score)
    if(field.coords(ball)[1] <= 0 or field.coords(ball)[3] >= 600): #keep ball in playing field vertically
        ball_y_motion = -ball_y_motion
        #increase speed
    if(not paused):  
        field.coords(ball, ball_x1 + ball_x_motion, ball_y1 + ball_y_motion, ball_x2 + ball_x_motion, ball_y2 + ball_y_motion)

        ball_x1 = field.coords(ball)[0]
        ball_x2 = field.coords(ball)[2]
        ball_y1 = field.coords(ball)[1]
        ball_y2 = field.coords(ball)[3]


        #ball moves every 10 milliseconds    
        field.after(10, ball_movement)


def move_left_paddle_up(event):
    global left_paddle_y1, left_paddle_y2
    #print(event.keysym)
    if(field.coords(left_paddle)[1] > 0):
        field.move("left_paddle", 0, -40)
        left_paddle_y1 = field.coords(left_paddle)[1]
        left_paddle_y2 = field.coords(left_paddle)[3]

def move_left_paddle_down(event):
    global left_paddle_y1, left_paddle_y2
    if(field.coords(left_paddle)[3] < 600):
        field.move("left_paddle", 0, 40)
        left_paddle_y1 = field.coords(left_paddle)[1]
        left_paddle_y2 = field.coords(left_paddle)[3]


def move_right_paddle_up(event):
    global right_paddle_y1, right_paddle_y2
    if(field.coords(right_paddle)[1] > 0):
        field.move("right_paddle", 0, -40)
        right_paddle_y1 = field.coords(right_paddle)[1]
        right_paddle_y2 = field.coords(right_paddle)[3]
        #print(event.keysym)

def move_right_paddle_down(event):
    global right_paddle_y1, right_paddle_y2
    if(field.coords(right_paddle)[3] < 600):
        field.move("right_paddle", 0, 40)
        right_paddle_y1 = field.coords(right_paddle)[1]
        right_paddle_y2 = field.coords(right_paddle)[3]
    #print(event.keysym) 
#Canvas
master = Tk() #master
field = Canvas(master, width=1000, height=600, bg="black") #playing field

master.bind('<w>', move_left_paddle_up) #left paddle up
master.bind('<s>', move_left_paddle_down) #left paddle down
master.bind('<Up>', move_right_paddle_up) #right paddle up
master.bind('<Down>', move_right_paddle_down) #right paddle down


#create field border lines with a rectangle
border = field.create_rectangle(0, 0, 1000, 600, fill="gray")

#create midline
midline = field.create_line(500, 0, 500, 600, fill="white", dash=(4, 4))

#create ball      
ball = field.create_oval(ball_x1, ball_y1, ball_x2, ball_y2, fill="white", tags=("ball"))


#create left paddle
left_paddle = field.create_rectangle(left_paddle_x1, left_paddle_y1, left_paddle_x2, left_paddle_y2, fill="red", tags=("left_paddle"))

#create right paddle
right_paddle = field.create_rectangle(right_paddle_x1, right_paddle_y1, right_paddle_x2, right_paddle_y2, fill="blue", tags=("right_paddle"))

#create Pause Button
pause_button = Button(master, text="Pause/Unpause", command=pause)
#pause_button.grid(row=1, column=1)
pause_button.pack()



#create Start Button
start_button = Button(master, text="Start", command=start)
#start_button.grid(row=1, column=3)
start_button.pack()

#left player scorekeeper
left_player_score_label = Label(master, text=left_player_score)
left_player_score_label.pack()

#right player scorekeeper
right_player_score_label = Label(master, text=right_player_score)
right_player_score_label.pack()

#create New Game Button
new_game_button = Button(master, text="New Game", command=lambda: new_game(True))
#new_game_button.grid(row=1, column=2)
new_game_button.pack()

#pack it all together on the screen
field.pack()

#execute loop to run screen processing
mainloop()
编辑

这是从包装更改为网格后的最终结果。我意识到你不是两个都用,而是一个或另一个

#PONG Game

from tkinter import *
import random
#http://www.tutorialspoint.com/python/tk_anchors.htm
#Globals
ball_x1 = 480
ball_x2 = 520
ball_y1 = 280
ball_y2 = 320

left_paddle_x1 = 0
left_paddle_x2 = 20
left_paddle_y1 = 240
left_paddle_y2 = 360

right_paddle_x1 = 980
right_paddle_x2 = 1000
right_paddle_y1 = 240
right_paddle_y2 = 360

left_player_score = 0
right_player_score = 0

paused = False
direction_factor = random.randrange(0,1)
ball_x_motion = 5
ball_y_motion = random.randrange(-5, 5)
if direction_factor == 0:
    ball_x_motion *= -1

def start():
    global paused
    if(field.coords(ball)[0] == 480):
        paused = False
        ball_movement()
    else:
        new_game(False)


def pause():
    global paused
    if(paused):
        paused = False
    else:
        paused = True
    ball_movement()
def new_game(reset):        
    global ball_x1, ball_x2, ball_y1, ball_y2, left_paddle_x1, left_paddle_x2, left_paddle_y1, left_paddle_yw
    global right_paddle_x1, right_paddle_x2, right_paddle_y1, right_paddle_y2
    global paused, left_player_score, right_player_score, ball_x_motion, ball_y_motion, direction_factor


    direction_factor = random.randrange(0,1)
    ball_x_motion = 10
    ball_y_motion = random.randrange(-10, 10)
    if direction_factor == 0:
        ball_x_motion *= -1 
    if(reset):
        left_player_score = 0
        right_player_score = 0

        left_player_score_label.config(text=left_player_score)
        right_player_score_label.config(text=right_player_score)

        left_paddle_x1 = 0
        left_paddle_x2 = 20
        left_paddle_y1 = 240
        left_paddle_y2 = 360

        right_paddle_x1 = 980
        right_paddle_x2 = 1000
        right_paddle_y1 = 240
        right_paddle_y2 = 360

        field.coords(left_paddle, left_paddle_x1,  left_paddle_y1, left_paddle_x2, left_paddle_y2)
        field.coords(right_paddle, right_paddle_x1,  right_paddle_y1, right_paddle_x2, right_paddle_y2)

        paused = True

    #starting positions
    ball_x1 = 480
    ball_x2 = 520
    ball_y1 = 280
    ball_y2 = 320


    field.coords(ball, ball_x1, ball_y1, ball_x2, ball_y2)



#Event Handlers

def ball_movement():
    #while(variable = true) move ball
    # move the object
    global ball_x_motion, ball_y_motion, ball_x1, ball_x2, ball_y1, ball_y2, paused
    global left_player_score, right_player_score

        #keep ball on playing field horizontally if ball hits paddles

    #print(((((left_paddle_y1 + left_paddle_y2)/2) - ((ball_y1 + ball_y2)/2))))
    if(((ball_x1 <= 20) and (-60 <= ((((left_paddle_y1 + left_paddle_y2)/2) - ((ball_y1 + ball_y2)/2))) <= 60)) or ((ball_x2 >= 980) and (-60 <= ((((right_paddle_y1 + right_paddle_y2)/2) - ((ball_y1 + ball_y2)/2))) <= 60))):
        ball_x_motion *= -1.1
        #ball_y_motion = ball_y_motion + 5
    elif(ball_x1 <=0):
        right_player_score += 1
        new_game(False)
        #paused = True
        right_player_score_label.config(text=right_player_score)
    elif(ball_x2 >= 1000):
        left_player_score += 1
        new_game(False)
        #paused = True
        left_player_score_label.config(text=left_player_score)
    if(field.coords(ball)[1] <= 0 or field.coords(ball)[3] >= 600): #keep ball in playing field vertically
        ball_y_motion = -ball_y_motion
    if(not paused):  
        field.coords(ball, ball_x1 + ball_x_motion, ball_y1 + ball_y_motion, ball_x2 + ball_x_motion, ball_y2 + ball_y_motion)

        ball_x1 = field.coords(ball)[0]
        ball_x2 = field.coords(ball)[2]
        ball_y1 = field.coords(ball)[1]
        ball_y2 = field.coords(ball)[3]


        #ball moves every 10 milliseconds    
        field.after(10, ball_movement)


def move_left_paddle_up(event):
    global left_paddle_y1, left_paddle_y2
    #print(event.keysym)
    if(field.coords(left_paddle)[1] > 0):
        field.move("left_paddle", 0, -40)
        left_paddle_y1 = field.coords(left_paddle)[1]
        left_paddle_y2 = field.coords(left_paddle)[3]

def move_left_paddle_down(event):
    global left_paddle_y1, left_paddle_y2
    if(field.coords(left_paddle)[3] < 600):
        field.move("left_paddle", 0, 40)
        left_paddle_y1 = field.coords(left_paddle)[1]
        left_paddle_y2 = field.coords(left_paddle)[3]


def move_right_paddle_up(event):
    global right_paddle_y1, right_paddle_y2
    if(field.coords(right_paddle)[1] > 0):
        field.move("right_paddle", 0, -40)
        right_paddle_y1 = field.coords(right_paddle)[1]
        right_paddle_y2 = field.coords(right_paddle)[3]
        #print(event.keysym)

def move_right_paddle_down(event):
    global right_paddle_y1, right_paddle_y2
    if(field.coords(right_paddle)[3] < 600):
        field.move("right_paddle", 0, 40)
        right_paddle_y1 = field.coords(right_paddle)[1]
        right_paddle_y2 = field.coords(right_paddle)[3]
    #print(event.keysym) 
#Canvas
master = Tk() #master
field = Canvas(master, width=1000, height=600, bg="black") #playing field
field.grid(row=4, columnspan=10)
#field.pack()

master.bind('<w>', move_left_paddle_up) #left paddle up
master.bind('<s>', move_left_paddle_down) #left paddle down
master.bind('<Up>', move_right_paddle_up) #right paddle up
master.bind('<Down>', move_right_paddle_down) #right paddle down


#create field border lines with a rectangle
border = field.create_rectangle(0, 0, 1000, 600, fill="gray")

#create midline
midline = field.create_line(500, 0, 500, 600, fill="white", dash=(4, 4))

#create ball      
ball = field.create_oval(ball_x1, ball_y1, ball_x2, ball_y2, fill="white", tags=("ball"))


#create left paddle
left_paddle = field.create_rectangle(left_paddle_x1, left_paddle_y1, left_paddle_x2, left_paddle_y2, fill="red", tags=("left_paddle"))

#create right paddle
right_paddle = field.create_rectangle(right_paddle_x1, right_paddle_y1, right_paddle_x2, right_paddle_y2, fill="blue", tags=("right_paddle"))

#create Pause Button
pause_button = Button(master, text="Pause/Unpause", command=pause)
pause_button.grid(row=1, column=6)
#pause_button.pack()



#create Start Button
start_button = Button(master, text="Start", command=start)
start_button.grid(row=1, column=4)
#start_button.pack()

#left player scorekeeper
left_player_score_label = Label(master, text=left_player_score)
left_player_score_label.grid(row=1, column=0)
#left_player_score_label.pack()

#right player scorekeeper
right_player_score_label = Label(master, text=right_player_score)
right_player_score_label.grid(row=1, column=9)
#right_player_score_label.pack()

#create New Game Button
new_game_button = Button(master, text="New Game", command=lambda: new_game(True))
new_game_button.grid(row=1, column=5)
#new_game_button.pack()

#pack it all together on the screen
#field.pack()

#execute loop to run screen processing
mainloop()

我意识到你不能同时使用网格管理器和包管理器,这是一个或另一个。所以我删除了我拥有的包,使用了所有的网格,并发布了最终结果

可以这样想:主窗口是主窗口。将画布打包,并将按钮和标签打包。他们去哪里取决于你。从这里开始:我觉得这条评论没有多大帮助,它相当模糊,但它确实让我思考了更多,我意识到你不会同时使用网格管理器和包管理器,它是一个或另一个。所以我删除了我的背包,并使用了所有的网格。结果是:我道歉。你现在似乎已经开始工作了;我的答案打了一半,但后来我觉得太长了,只是重复了我链接的页面上的所有内容,所以我选择将链接作为评论保留。不管怎样,祝你在项目的其余部分好运@user3533772:您可以在同一应用程序中同时使用网格和包,但不能在共享同一父级的小部件上同时使用网格和包。您可以在同一应用程序中同时使用网格和包,但不能在共享同一父级的小部件上同时使用网格和包。