gpt4 book ai didi

python - 无法获取 tkinter 中在类里面制作的内容

转载 作者:行者123 更新时间:2023-12-01 01:39:42 24 4
gpt4 key购买 nike

我是 Python 新手,目前正在尝试使用 tkinter 作为第一个 GUI。我已经习惯了不用上课就能做到这一点。这是我第一次使用 import tkinter as tk 而不是 import *

import tkinter as tk

def update():
pass

#Game.statsFrame #doesn't work Game.statsFrame.stat1_amountLabel too
#Game.stat1_amountLabel #doesnt work < want to use update_idletasks() or
#just type new cofnig...
#just errors like: "Game' has no attribute 'statsFrame" etc #Game


class character:
name = ""
experience = 0
level = 0
gold = 0
stat1 = 0
stat2 = 0
stat3 = 0
stat4 = 0
stat5 = 0
avaiblePoints = 0
def add_stat1(self):
if self.avaiblePoints >= 1:
self.stat1 += 1
self.avaiblePoints -= 1
update()
else:
pass
def add_stat2(self):
if self.avaiblePoints >= 1:
self.stat2 += 1
self.avaiblePoints -= 1
update()
[...]

myChar = character()
myChar.avaiblePoints = 3

class Game:
def __init__(self, parent):
self.myParent = parent
self.myGame = tk.Frame(parent)
self.myGame.grid()

self.statsFrame = tk.Frame(self.myGame).grid()

self.stat1Label = tk.Label(self.statsFrame)
self.stat1Label.config(text="Strength:")
self.stat1Label.grid(column=1, row=1)

self.stat1_amountLabel = tk.Label(self.statsFrame)
self.stat1_amountLabel.config(text=myChar.stat1)
self.stat1_amountLabel.grid(column=2, row=1)

self.add_stat1Button = tk.Button(self.statsFrame)
self.add_stat1Button.config(text="+", command=myChar.add_stat1)
self.add_stat1Button.grid(column=3, row=1)

root = tk.Tk()
myapp = Game(root)
root.mainloop()

但我无法访问(例如)stat1Label 并更改其中的文本,然后使用 update_idletasks()。就好像它不存在一样。错误表明 Game 没有 stat1Label 等属性。

我想使用它,因为我读到 __init__ 方法更好,并且我想在页面之间切换。我不知道,当我没有在 tkinter 中使用类时,有些事情(比如这样)更容易并且没有问题。我很困惑。

最佳答案

非常好,您使用 import tkinter as tk 而不是可怕的“星号”导入,并且您正在尝试使用类来组织代码。一开始它可能会有点令人困惑,但它使您的代码更加模块化,这有很大帮助,尤其是当 GUI 变大时。

您的代码存在一些问题。最重要的是这一行:

self.statsFrame = tk.Frame(self.myGame).grid()

.grid 方法(以及 .pack.place)均返回 None。因此该行将 None 保存到 self.statsFrame,而不是 Frame 小部件。因此,当您稍后尝试使用 self.statsFrame 执行操作时,它不会执行您期望的操作。

另一个问题是 self.stat1_amountLabeltext 属性不会跟踪 myChar.stat1 的值,因此当您更改 myChar.stat1 的值,您需要使用新值显式更新标签。或者,您可以将 textvariable 属性与 IntVar 一起使用。保存角色的统计数据。请参阅 Label config docs 中的 textvariable 条目。获取信息。

你的character类有一大堆属性,如nameexperience等作为类属性。这不是一个好主意,因为类属性由类的所有实例共享。但您可能希望每个角色实例都有自己的实例属性。因此,您应该为 character 提供一个 __init__ 方法来设置这些属性。 OTOH,可以使用类属性作为被实例属性覆盖的默认值。

无论如何,这是代码的修复版本,其中包含更新强度统计数据的按钮。我已将统计信息放在一个列表中,而不是拥有一堆必须单独管理的单独命名的统计信息。我为 Game 提供了 make_stat 方法,以便您可以轻松添加其他统计数据的行。

import tkinter as tk

class Character:
def __init__(self, availablePoints=0):
self.name = ""
self.experience = 0
self.level = 0
self.gold = 0
self.stats = [0] * 5
self.availablePoints = availablePoints

def add_stat(self, idx):
if self.availablePoints >= 1:
self.stats[idx] += 1
self.availablePoints -= 1

class Game:
def __init__(self, parent):
self.myParent = parent
self.myGame = tk.Frame(parent)
self.myGame.grid()

self.statsFrame = tk.Frame(self.myGame)
self.statsFrame.grid()

self.make_stat("Strength:", 0, 0)

def make_stat(self, text, idx, row):
label = tk.Label(self.statsFrame, text=text)
label.grid(column=1, row=row)

amount = tk.Label(self.statsFrame, text=myChar.stats[idx])
amount.grid(column=2, row=row)

def update():
myChar.add_stat(idx)
amount["text"] = myChar.stats[idx]

button = tk.Button(self.statsFrame, text="+", command=update)
button.grid(column=3, row=row)

myChar = Character(3)

root = tk.Tk()
myapp = Game(root)
root.mainloop()

这段代码仍然不理想,但它是一个改进。 ;) 例如,最好为 Game 提供一个创建新角色的方法,而不是在全局上下文中创建它们。您可以将它们存储在 Gamedict 属性中,使用角色的名字作为键。

<小时/>

这是一个适用于单独命名的 stat 属性的新版本。正如我在评论中所说,这样做比使用列表来保存统计数据更复杂(而且效率更低)。

import tkinter as tk

class Character:
def __init__(self, availablePoints):
self.name = ""
self.experience = 0
self.level = 0
self.gold = 0
self.stat1 = 0
self.stat2 = 0
self.stat3 = 0
self.stat4 = 0
self.stat5 = 0
self.availablePoints = availablePoints

class Game:
def __init__(self, parent):
self.myParent = parent
self.myGame = tk.Frame(parent)
self.myGame.grid()

self.statsFrame = tk.Frame(self.myGame)
self.statsFrame.grid()

self.make_stat("Strength:", "stat1", 1, 1)

def make_stat(self, text, stat, column, row):
label = tk.Label(self.statsFrame, text=text)
label.grid(column=column, row=row)

amount = tk.Label(self.statsFrame, text=getattr(myChar, stat))
amount.grid(column=(column+1), row=row)

def update():
if myChar.availablePoints >= 1:
v = getattr(myChar, stat) + 1
setattr(myChar, stat, v)
myChar.availablePoints -= 1
amount["text"] = v

button = tk.Button(self.statsFrame, text="+", command=update)
button.grid(column=(column+2), row=row)

myChar = Character(5)

root = tk.Tk()
myapp = Game(root)
root.mainloop()

关于python - 无法获取 tkinter 中在类里面制作的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52018496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com