TypeError: int() argument must be a string, a bytes-like object or a number, not 'TextInput'
TypeError: int() argument must be a string, a bytes-like object or a number, not 'TextInput'
我正在开发一个 Kivy 密码生成器。用户需要在应用程序中输入一个数字(数字)以生成密码,具体取决于预期的字符数。然后,应用程序将从 randint 中生成一个随机字符,最后,输出将显示到输出条目中以复制到点击板。以下是我的代码:
password_generator.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.core.window import Window
from random import randint
Builder.load_file('password_generator.kv')
Window.size = (350, 600)
class MainApp(App):
title='Password Generator'
def build(self):
Window.clearcolor = (255/255, 255/255, 0, 1)
return Mylayout()
def password(self):
self.root.ids.output_entry = ''
pw_length = int(self.root.ids.input_entry)
my_password = ''
for x in range(pw_length):
my_password += chr(randint(33, 126))
self.root.ids.output_entry = my_password
def clip_board(self):
self.root.clipboard_clear()
self.root.clipboard_append(self.root.ids.output_entry)
def delete(self):
self.root.ids.input_entry = ''
self.root.ids.output_entry = ''
class Mylayout(Widget):
pass
if __name__ == '__main__':
MainApp().run()
password_generator.kv
#:import Factory kivy.factory.Factory
<MyLayout>
FloatLayout:
Label:
id: label_frame
text: 'How Many Characters?'
pos_hint: {'x': .8, 'y':5}
size_hint: (2, .4)
color: (0, 0, 0, 1)
font_size: 24
TextInput:
id: input_entry
text: ''
multiline: False
font_family: 'Helvatica'
font_size: 24
pos_hint: {'x': .8, 'y':4.5}
size_hint: (2, .4)
halign: "center"
focus: True
color: 'black'
Button:
text:'Generate A Strong Password'
on_press: app.password()
pos_hint: {'x': .8, 'y':3.8}
size_hint: (2, .4)
font_size: 15
TextInput:
id: output_entry
text: ''
multiline: False
font_family: 'Helvatica'
font_size: 24
pos_hint: {'x': .8, 'y':3}
size_hint: (2, .4)
halign: "center"
focus: True
color: 'black'
background_color : (255/255, 255/255, 0, 1)
#foreground_color: self.background_color
color : 'black'
Button:
text : 'Copy To Clickboard'
on_release: Factory.MyPopup().open(),
on_press: app.clip_board()
pos_hint: {'x': .8, 'y':2.5}
size_hint: (2, .4)
font_size: 15
Button:
text : "Reset"
on_press : app.delete()
pos_hint: {'x': .8, 'y':1.5}
size_hint: (2, .4)
font_size: 15
<MyPopup@Popup>
# auto_dismiss: False
auto_dismiss: True
size_hint: 0.6, 0.2
pos_hint: {'x':0.2, 'top':0.6}
title: "Message Informed"
BoxLayout
orientation: "vertical"
size: root.width, root.height
Label:
text: "Password Copied!"
font_size: 15
Button:
text: "Close!"
font_size: 15
on_release: root.dismiss()
当我点击Generate Strong Password按钮时,要求在输出条目中输出一个随机的密码字符,但是,出现了以下错误:
Traceback (most recent call last):
File "c:\Users\Kelvin Loh\Documents\kivyMD\password_generator.py", line 53, in <module>
MainApp().run()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\app.py", line 950, in run
runTouchApp()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 582, in runTouchApp
EventLoop.mainloop()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 347, in mainloop
self.idle()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 391, in idle
self.dispatch_input()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 342, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 248, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\core\window\__init__.py", line 1412, in on_motion
self.dispatch('on_touch_down', me)
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\core\window\__init__.py", line 1428, in on_touch_down
if w.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
self.dispatch('on_press')
File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
File "kivy\_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
exec(__kvlang__.co_value, idmap)
File "C:\Users\Kelvin Loh\Documents\kivyMD\password_generator.kv", line 30, in <module>
on_press: app.password()
File "c:\Users\Kelvin Loh\Documents\kivyMD\password_generator.py", line 24, in password
pw_length = int(self.root.ids.input_entry)
File "kivy\weakproxy.pyx", line 254, in kivy.weakproxy.WeakProxy.__int__
TypeError: int() argument must be a string, a bytes-like object or a number, not 'TextInput'
如何解决?
尝试将 password()
函数中的 pw_length 更改为:
pw_length = int(self.root.ids.input_entry.text or 0)
input_entry 是无法转换为 int 的 TextInput。我认为您想将其值 (input_entry.text
) 转换为 int,而不是小部件本身。为此,如上更改 password()
方法中的 pw_length = ...
行。
当您使用 self.root.ids.some_name
(或 self.ids.some_name
)之类的东西时,您应该从 [=14] 访问已命名 (some_name
) 小部件的 weak reference =](或者,一些 class)。
现在要获得属性。该代理小部件的您可以像往常一样使用“。”语法即 self.root.ids.some_name.prop
(或 self.ids.some_name.prop
)。
这里,self.root.ids.output_entry
是一个TextInput
实例。因此,要访问它的任何属性,您可以执行类似 self.root.ids.output_entry.prop_name
的操作。有了这个我修改了 password
方法,
def password(self):
self.root.ids.output_entry.text = ''
input_text = self.root.ids.input_entry.text
# Bellow you will handle user-input. You can use try-except or if-else or whatever that suits. I just implement a simple one.
if input_text: # Means non-empty string.
pw_length = int(input_text)
else: # Raise Error or warn user via a message.
pw_length = 0
my_password = ''
for x in range(pw_length):
my_password += chr(randint(33, 126))
self.root.ids.output_entry.text = my_password
不要忘记在必要时应用所需的更改(如上所述)。
首先,必须通过添加 input_filter: "int"
将文本字段限制为仅支持整数
TextInput:
id: input_entry
text: ''
multiline: False
font_family: 'Helvatica'
font_size: 24
pos_hint: {'x': .8, 'y':4.5}
size_hint: (2, .4)
halign: "center"
focus: True
color: 'black'
input_filter: "int"
我正在开发一个 Kivy 密码生成器。用户需要在应用程序中输入一个数字(数字)以生成密码,具体取决于预期的字符数。然后,应用程序将从 randint 中生成一个随机字符,最后,输出将显示到输出条目中以复制到点击板。以下是我的代码:
password_generator.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.core.window import Window
from random import randint
Builder.load_file('password_generator.kv')
Window.size = (350, 600)
class MainApp(App):
title='Password Generator'
def build(self):
Window.clearcolor = (255/255, 255/255, 0, 1)
return Mylayout()
def password(self):
self.root.ids.output_entry = ''
pw_length = int(self.root.ids.input_entry)
my_password = ''
for x in range(pw_length):
my_password += chr(randint(33, 126))
self.root.ids.output_entry = my_password
def clip_board(self):
self.root.clipboard_clear()
self.root.clipboard_append(self.root.ids.output_entry)
def delete(self):
self.root.ids.input_entry = ''
self.root.ids.output_entry = ''
class Mylayout(Widget):
pass
if __name__ == '__main__':
MainApp().run()
password_generator.kv
#:import Factory kivy.factory.Factory
<MyLayout>
FloatLayout:
Label:
id: label_frame
text: 'How Many Characters?'
pos_hint: {'x': .8, 'y':5}
size_hint: (2, .4)
color: (0, 0, 0, 1)
font_size: 24
TextInput:
id: input_entry
text: ''
multiline: False
font_family: 'Helvatica'
font_size: 24
pos_hint: {'x': .8, 'y':4.5}
size_hint: (2, .4)
halign: "center"
focus: True
color: 'black'
Button:
text:'Generate A Strong Password'
on_press: app.password()
pos_hint: {'x': .8, 'y':3.8}
size_hint: (2, .4)
font_size: 15
TextInput:
id: output_entry
text: ''
multiline: False
font_family: 'Helvatica'
font_size: 24
pos_hint: {'x': .8, 'y':3}
size_hint: (2, .4)
halign: "center"
focus: True
color: 'black'
background_color : (255/255, 255/255, 0, 1)
#foreground_color: self.background_color
color : 'black'
Button:
text : 'Copy To Clickboard'
on_release: Factory.MyPopup().open(),
on_press: app.clip_board()
pos_hint: {'x': .8, 'y':2.5}
size_hint: (2, .4)
font_size: 15
Button:
text : "Reset"
on_press : app.delete()
pos_hint: {'x': .8, 'y':1.5}
size_hint: (2, .4)
font_size: 15
<MyPopup@Popup>
# auto_dismiss: False
auto_dismiss: True
size_hint: 0.6, 0.2
pos_hint: {'x':0.2, 'top':0.6}
title: "Message Informed"
BoxLayout
orientation: "vertical"
size: root.width, root.height
Label:
text: "Password Copied!"
font_size: 15
Button:
text: "Close!"
font_size: 15
on_release: root.dismiss()
当我点击Generate Strong Password按钮时,要求在输出条目中输出一个随机的密码字符,但是,出现了以下错误:
Traceback (most recent call last):
File "c:\Users\Kelvin Loh\Documents\kivyMD\password_generator.py", line 53, in <module>
MainApp().run()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\app.py", line 950, in run
runTouchApp()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 582, in runTouchApp
EventLoop.mainloop()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 347, in mainloop
self.idle()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 391, in idle
self.dispatch_input()
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 342, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\base.py", line 248, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\core\window\__init__.py", line 1412, in on_motion
self.dispatch('on_touch_down', me)
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\core\window\__init__.py", line 1428, in on_touch_down
if w.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
self.dispatch('on_press')
File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
File "kivy\_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
exec(__kvlang__.co_value, idmap)
File "C:\Users\Kelvin Loh\Documents\kivyMD\password_generator.kv", line 30, in <module>
on_press: app.password()
File "c:\Users\Kelvin Loh\Documents\kivyMD\password_generator.py", line 24, in password
pw_length = int(self.root.ids.input_entry)
File "kivy\weakproxy.pyx", line 254, in kivy.weakproxy.WeakProxy.__int__
TypeError: int() argument must be a string, a bytes-like object or a number, not 'TextInput'
如何解决?
尝试将 password()
函数中的 pw_length 更改为:
pw_length = int(self.root.ids.input_entry.text or 0)
input_entry 是无法转换为 int 的 TextInput。我认为您想将其值 (input_entry.text
) 转换为 int,而不是小部件本身。为此,如上更改 password()
方法中的 pw_length = ...
行。
当您使用 self.root.ids.some_name
(或 self.ids.some_name
)之类的东西时,您应该从 [=14] 访问已命名 (some_name
) 小部件的 weak reference =](或者,一些 class)。
现在要获得属性。该代理小部件的您可以像往常一样使用“。”语法即 self.root.ids.some_name.prop
(或 self.ids.some_name.prop
)。
这里,self.root.ids.output_entry
是一个TextInput
实例。因此,要访问它的任何属性,您可以执行类似 self.root.ids.output_entry.prop_name
的操作。有了这个我修改了 password
方法,
def password(self):
self.root.ids.output_entry.text = ''
input_text = self.root.ids.input_entry.text
# Bellow you will handle user-input. You can use try-except or if-else or whatever that suits. I just implement a simple one.
if input_text: # Means non-empty string.
pw_length = int(input_text)
else: # Raise Error or warn user via a message.
pw_length = 0
my_password = ''
for x in range(pw_length):
my_password += chr(randint(33, 126))
self.root.ids.output_entry.text = my_password
不要忘记在必要时应用所需的更改(如上所述)。
首先,必须通过添加 input_filter: "int"
TextInput:
id: input_entry
text: ''
multiline: False
font_family: 'Helvatica'
font_size: 24
pos_hint: {'x': .8, 'y':4.5}
size_hint: (2, .4)
halign: "center"
focus: True
color: 'black'
input_filter: "int"