Python 非类型对象不可下标pysimplegui
我试图同时学习python和pysimplegui。而且我老了,这也没用 我正在和我10岁的儿子(盲人领导盲人)一起写一个实践计划,遇到了一个我无法解决的问题 基本上,该程序允许您输入要选择的数字和要选择的数字,然后计算获胜的几率。点击generate为您随机选取数字,并将结果打印到txt文件中以记录您的选取 这一切工作正常,但当我关闭窗口,我得到一个非类型的错误,我无法解决 你们这些天才能帮上什么忙吗? 这是令人不快的路线 n=int(值['--tn--'])Python 非类型对象不可下标pysimplegui,python,python-3.x,pysimplegui,Python,Python 3.x,Pysimplegui,我试图同时学习python和pysimplegui。而且我老了,这也没用 我正在和我10岁的儿子(盲人领导盲人)一起写一个实践计划,遇到了一个我无法解决的问题 基本上,该程序允许您输入要选择的数字和要选择的数字,然后计算获胜的几率。点击generate为您随机选取数字,并将结果打印到txt文件中以记录您的选取 这一切工作正常,但当我关闭窗口,我得到一个非类型的错误,我无法解决 你们这些天才能帮上什么忙吗? 这是令人不快的路线 n=int(值['--tn--']) 有些东西不好 您应该首先检查窗口
有些东西不好
事件、值
,其他情况如下面的代码。您可以将事件、值
设置为None、None
如果不是,则值['--tn--']
将与None['--tn--']
相同。这就是为什么会出现TypeError:“NoneType”对象不可下标的原因
为True时:
事件,值=window.read()
如果事件发生(sg.WINDOW_关闭,“关闭”):
打破
#从这里处理其他事件
window.close()
values['--tn--']
或values['--pn--']
可能不具有整数的正确格式,因此以下代码可能会出现故障ValueError:int()的文本无效,基为10
n=int(值['--tn--'])
rr=int(值['--pn--'])
这是我避免问题的方法
def整数(字符串):
尝试:
value=int(字符串)
除:
值=无
返回值
对于“10.5”、“10”、“10”中的字符串:
值=整数(字符串)
如果值为“无”:
打印(f“{repr(string)}不是合法的整数字符串!”)
其他:
打印(f“{repr(string)}转换为{value}!”)
X
后,窗口会被破坏,所以您不应该更新窗口上的任何内容如果事件==WIN\u关闭:
#窗口['--tn--']。更新('1')
打破
事件,values=window.read()
正在返回None
None['--tn--']
不存在,因为None
没有属性是没有意义的,因此会出现错误消息。您已使用该测试来避免此问题,但将其移动到下面以尝试使用缺少的属性。因此出现了错误
还值得使用linting工具提示您对语法进行调整,这将破坏您的代码和良好实践警告。我使用pylint和Flake 8。下面通过整理linter消息来解决您的特定错误消息。仍然有一些警告-良好的学习练习:)
“学习程序”
从操作系统导入关闭
随机输入
将PySimpleGUI导入为sg
导入日期时间
输入数学
从PySimpleGUI.PySimpleGUI导入打开,WIN_关闭,main
导入系统
sg.主题(“Reddit”)
布局=[
[sg.In(大小=(5,1),k=“--tn-”)+
[sg.Text('输入数字总数',大小=(35,1))],
[sg.In(大小=(5,1),k=“--pn-”)]+
[sg.Text('输入您选择的数字数量',大小=(35,1))],
[sg.Text(“胜算”)]+
[sg.ML(
背景颜色为浅珊瑚色,文本颜色为白色,键为--oddout--,大小为(50,2)
)],
[sg.ML(大小=(20,30),键='--main--')],
[sg.Submit('赔率',key='--赔率--')]+
[sg.Submit('Generate',key='--gen--')]+
[政府公报取消(“取消”)]+
[sg.Save(key='--Save--')]+
[sg.CloseButton('Close',pad=(100,0))]
]
窗口=sg.窗口('乐透号码生成器',布局)
尽管如此:
事件,值=window.read()
#将接下来的三行向上移动,并对更新进行了注释,这也会导致错误
如果事件==WIN_关闭:
#窗口['--tn--']。更新('1')
打破
n=int(值['--tn--'])
rr=int(值['--pn--'])
nf=数学阶乘(n)
rf=数学阶乘(rr)
胜算=(nf/(rf*数学阶乘(n-rr)))
胜算=int(胜算)
now=datetime.datetime.now()
如果事件=='--gen--':
r=随机样本(范围(1,n),rr)
对于r中的i:
窗口['--main--'].打印(i)
如果事件=='--赔率--':
窗口['--oddout--']。打印(
“你获胜的机会是,”{windoffics:,d},“,对1,祝你好运”
)
如果事件==“取消”:
窗口['--oddout-->]。更新(“”)
窗口['--tn--'].更新('')
窗口['--pn--']。更新('')
如果事件=='--保存--':
sys.stdout=open(“lotto.txt”、“w”)
打印(值['--main--'])
sys.stdout=close(fd=0)
window.close()
特别是Flake8将提示您遵循没有明显实际用途的实践。后来,随着您更多地使用该语言,flake8提示的好处是良好的习惯,最终会带来巨大的好处。当您关闭窗口时,
事件和值未设置,请参见下面的示例
在调试过程中,最好打印出事件的当前值
和值
,以便检查您是否得到了您认为会得到的结果,如下所示:
def test():
layout = [[sg.In(size=(5, 1), k="--tn--"), sg.Text('Enter total amount of numbers', size=(35, 1))],
[sg.In(size=(5, 1), k="--pn--"), sg.Text('Enter how many numbers you are picking', size=(35, 1))],
[sg.Text('Win odds'),
sg.ML(background_color='light coral', text_color='white', key='--oddout--', size=(50, 2))],
[sg.ML(size=(20, 30), key='--main--')],
[sg.Submit('Odds', key='--odds--'), sg.Submit('Generate', key='--gen--'),
sg.Cancel('Cancel'), sg.Save(key=' - -save - -'), sg.CloseButton('Close', pad=(100, 0))]
]
window = sg.Window('Lotto number generator', layout)
while True:
event, values = window.read()
print(f'event = {event}, values = {values}')
if event == WIN_CLOSED:
break
window.close()
当你关上窗户的时候,你会发现
event=None,values={'-tn--':None'--pn--':None'--oddout--':None'--main--':None}
因此,如果event==WIN\u CLOSED:
(在这种情况下,中断循环),则使用启动主循环非常重要。只有在这之后,您才能继续处理各种事件和值。感谢jwal的快速回复,有很多要查看的内容。如果我们中了彩票,我们会帮你解决……)如果你有时间的话,你能解释一下(用一个5岁的孩子能听懂的语言)吗☺), 为什么window.read()行在向上移动event==close行之前返回none?您可以将变量window
视为实际值
'10.5' is not a legal integer string !
'' is not a legal integer string !
'10' converted to 10 !
def test():
layout = [[sg.In(size=(5, 1), k="--tn--"), sg.Text('Enter total amount of numbers', size=(35, 1))],
[sg.In(size=(5, 1), k="--pn--"), sg.Text('Enter how many numbers you are picking', size=(35, 1))],
[sg.Text('Win odds'),
sg.ML(background_color='light coral', text_color='white', key='--oddout--', size=(50, 2))],
[sg.ML(size=(20, 30), key='--main--')],
[sg.Submit('Odds', key='--odds--'), sg.Submit('Generate', key='--gen--'),
sg.Cancel('Cancel'), sg.Save(key=' - -save - -'), sg.CloseButton('Close', pad=(100, 0))]
]
window = sg.Window('Lotto number generator', layout)
while True:
event, values = window.read()
print(f'event = {event}, values = {values}')
if event == WIN_CLOSED:
break
window.close()