【问题标题】:How to apply same method to two different frames, containing different widgets, in Tkinter GUI如何在 Tkinter GUI 中将相同的方法应用于包含不同小部件的两个不同框架
【发布时间】:2020-12-03 11:47:25
【问题描述】:

我正在制作一个板球比赛,其中可以选择两支球队参加比赛。用户可以通过单击下一个和上一个按钮从所有可用团队中选择两个团队,每次单击都会更改图像(实际上是团队的标志)和团队的名称。我为选择过程创建了一个通用函数。在该函数/方法中,标签和按钮已经存在并打包。我只需将分配的帧作为参数传递给函数,分别为团队 1 和团队 2 调用它。

现在的问题是,在为第一方(Team1)调用该函数后,当我为第二方(Team 2)调用该函数时,图像和名称仅在第二方更改。 通过查看程序可以更好地理解这个问题,因为也许我无法解释我的问题。 我希望两对下一个和上一个按钮独立工作以选择团队。我试图为这个东西创建一个单独的类,但这完全是一个无关紧要的解决方案,当然是行不通的。

从我的完整游戏代码中提取的一段代码附在下面。

from tkinter import *

class CricketMatch(Tk):
    def __init__(self):
        super(CricketMatch, self).__init__()

        self.title("Cricket 2020")
        self.geometry('980x660+200-60')
        self.state('zoomed')

        selection_Frame = Frame(self)
        selection_Frame.pack()

        ### TEAM 1 CONTAINER ###
        Team1_Container = Frame(selection_Frame)
        Team1_Container.pack(side = LEFT)

        ButtonFrame = Frame(Team1_Container)
        self.select_Teams(Team1_Container, ButtonFrame)   #Function called for team1
        ButtonFrame.pack(pady = (20,0))

        vsLabel = Label(selection_Frame, text = 'VS')
        vsLabel.pack(side = LEFT, padx = 50)

        # ### TEAM 2 CONTAINER ###
        Team2_Container = Frame(selection_Frame)
        Team2_Container.pack()

        ButtonFrame2 = Frame(Team2_Container)
        self.select_Teams(Team2_Container, ButtonFrame2)   #Function called for team2
        ButtonFrame2.pack(pady = (20,0))

    def select_Teams(self, ImageFrame, ButtonFrame):
        self.teams = ['Afghanistan', 'Australia', 'Bangladesh', 'England', 'India',
                    'Ireland', 'Kenya', 'Netherlands', 'Newzealand', 'Pakistan',
                    'Scotland', 'SouthAfrica', 'Srilanka', 'UAE', 'WestIndies',
                    'Zimbabwe']
        self.cur_image = 0

        self.image = Label(ImageFrame, text = f"{self.teams[self.cur_image]}.png" , font=('', 12, 'bold'), bg='light blue')
        self.image.pack(ipady = 30)

        self.left = Button(ButtonFrame, text="<", fg='red', font=('', 11, 'bold'), command=self.lefttoggle)
        self.left.pack(side=LEFT)

        self.image_name=Label(ButtonFrame, text=self.teams[self.cur_image], font=('', 10,'bold'))
        self.image_name.pack(side=LEFT)

        self.right = Button(ButtonFrame, text=">", fg='red', font=('', 11, 'bold'), command=self.righttoggle)
        self.right.pack(side=LEFT)

    def lefttoggle(self):
        self.cur_image = (self.cur_image - 1) % len(self.teams)
        self.update_image()

    def righttoggle(self):
        self.cur_image = (self.cur_image + 1) % len(self.teams)
        self.update_image()

    def update_image(self):
        self.image.config(text=f"{self.teams[self.cur_image]}.png")
        self.image_name.config(text=self.teams[self.cur_image])


Match = CricketMatch()
Match.mainloop()

【问题讨论】:

  • 你为什么要对 self.cur_image 做模运算
  • @reece 按下按钮时以连续方式显示下一个和上一个图像。还有其他方法吗?实际上,我已经从其他地方为这件事编辑了另一段代码。
  • @reece 如果有更好的方法来完成所有这些工作,请分享。我会非常感谢你。
  • 不,我只是想知道,因为它不是我以前见过的任何东西来环绕数组

标签: python python-3.x tkinter methods


【解决方案1】:

由于您对两个团队选择使用了相同的实例变量集,因此它们将对第二个团队选择有效。

您应该将团队选择封装在一个类中:

class TeamSelector(Frame):
    teams = ['Afghanistan', 'Australia', 'Bangladesh', 'England', 'India',
             'Ireland', 'Kenya', 'Netherlands', 'Newzealand', 'Pakistan',
             'Scotland', 'SouthAfrica', 'Srilanka', 'UAE', 'WestIndies',
             'Zimbabwe']

    def __init__(self, master, *args, **kw):
        super().__init__(master, *args, **kw)
        self.cur_image = 0

        self.image = Label(self, text=f"{self.teams[self.cur_image]}.png", font=('', 12, 'bold'), bg='light blue')
        self.image.pack(ipady=30, fill=X)

        btn_frame = Frame(self)
        btn_frame.pack(pady=(20,0))

        self.left = Button(btn_frame, text="<", fg='red', font=('', 11, 'bold'), command=self.left_toggle)
        self.left.pack(side=LEFT)

        self.image_name = Label(btn_frame, text=self.teams[self.cur_image], font=('', 10,'bold'), width=20)
        self.image_name.pack(side=LEFT)

        self.right = Button(btn_frame, text=">", fg='red', font=('', 11, 'bold'), command=self.right_toggle)
        self.right.pack(side=LEFT)

    def left_toggle(self):
        self.cur_image = (self.cur_image - 1) % len(self.teams)
        self.update_image()

    def right_toggle(self):
        self.cur_image = (self.cur_image + 1) % len(self.teams)
        self.update_image()

    def update_image(self):
        self.image.config(text=f"{self.teams[self.cur_image]}.png")
        self.image_name.config(text=self.teams[self.cur_image])

然后使用这个类为团队 1 和团队 2 选择创建实例:

class CricketMatch(Tk):
    def __init__(self):
        super().__init__()

        self.title("Cricket 2020")
        self.geometry('980x660+200-60')
        self.state('zoomed')

        selection_Frame = Frame(self)
        selection_Frame.pack()

        ### TEAM 1 SELECTOR ###
        self.team1 = TeamSelector(selection_Frame)
        self.team1.pack(side=LEFT)

        vsLabel = Label(selection_Frame, text = 'VS')
        vsLabel.pack(side=LEFT, padx=50)

        ### TEAM 2 SELECTOR ###
        self.team2 = TeamSelector(selection_Frame)
        self.team2.pack()

【讨论】:

  • 谢谢你?你总是很乐于助人❣️
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2021-02-10
  • 2011-04-15
  • 2020-09-17
相关资源
最近更新 更多