如何在Python切片[:]中使用tkinter Combobox绑定的lentgh变量 解决切片索引报错
报错核心原因
TypeError: slice indices must be integers or None or have an index method 触发的根源非常直接:
- 你代码里定义的
lentgh是Tkinter封装的IntVar类实例,不是Python原生整数。切片语法[:]只接受原生整数、None或者实现了__index__方法的对象,直接传IntVar实例进去,解释器没法把它识别成合法的切片边界值,自然会抛类型错误。
具体修正步骤
- 调用
IntVar实例的.get()方法,取出内部存储的原生整数值,替换切片里直接传变量的写法
把randalp()函数里的原语句:
改成:return string[:lentgh]
这里额外加了return ''.join(string[:lentgh.get()])''.join()是因为你现在打乱后是存成列表的,直接返回列表赋值给StringVar做标签显示的话,会出现带方括号、引号的不美观输出,转成字符串之后就能直接展示正常的密码内容。 - (非强制优化)把拼写错误的变量名
lentgh全局替换为length,减少后续维护的拼写失误概率。
修正后可直接运行的完整代码
from tkinter import * from tkinter import ttk import random window = Tk() window.resizable(False , False) window.title('Password Generator') window.geometry('400x200') length = IntVar() lbl = StringVar() var1 = StringVar() Alphabet = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' showpass = ttk.Label(window , textvariable = lbl).pack() def randalp(): string = list(Alphabet) random.shuffle(string) return ''.join(string[:length.get()]) ttk.Label(window , text = 'Password Length:').pack() numchoosen = ttk.Combobox(window, width = 12 , textvariable = length) numchoosen['values'] = (5,6,7,8,9,10) numchoosen.pack() numchoosen.current(2) numchoosen.config(state = 'readonly') rad1 = ttk.Checkbutton(window , text = 'Alphabet' , variable = var1).pack() def btnclick(): get1 = var1.get() if get1 == '1': lbl.set(randalp()) btn = ttk.Button(window , text = 'Generate' , command = btnclick).pack() window.mainloop()
内容的提问来源于stack exchange,提问作者user15426885
相关产品推荐
相关产品推荐

