Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非类型对象不可下标pysimplegui_Python_Python 3.x_Pysimplegui - Fatal编程技术网

Python 非类型对象不可下标pysimplegui

Python 非类型对象不可下标pysimplegui,python,python-3.x,pysimplegui,Python,Python 3.x,Pysimplegui,我试图同时学习python和pysimplegui。而且我老了,这也没用 我正在和我10岁的儿子(盲人领导盲人)一起写一个实践计划,遇到了一个我无法解决的问题 基本上,该程序允许您输入要选择的数字和要选择的数字,然后计算获胜的几率。点击generate为您随机选取数字,并将结果打印到txt文件中以记录您的选取 这一切工作正常,但当我关闭窗口,我得到一个非类型的错误,我无法解决 你们这些天才能帮上什么忙吗? 这是令人不快的路线 n=int(值['--tn--']) 有些东西不好 您应该首先检查窗口

我试图同时学习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()