При добавлении события в кнопку в Python + Kivy окна закрываются автоматически - PullRequest
0 голосов
/ 02 июля 2019

Я изучаю Python + Kivy, и окно автоматически закрывается при добавлении события к кнопке. Однако, когда я добавляю кнопку, которая ничего не делает, приложение прекрасно работает.

Я пытался добавить кнопку без событий и прошел через все виды уроков и форумов. Кажется, ничто не поможет. Кроме того, я скопировал / вставил строку с кнопкой в ​​моем коде, потом подумав, что произошла опечатка. Это не сработало.

Импорт:

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button

Кнопка и событие:

self.submit = Button(text="Submit", font_size=20)
self.submit.bind(on_press=self.submit)
self.add_widget(self.submit)

Определенная функция:

def submit(self, instance):
        print('You pressed the button!')

Выход терминала:

bob@I-am-Bob:~/Programs/Kivy_Python$ python3 main.py 
[INFO   ] [Logger      ] Record log in /home/bob/.kivy/logs/kivy_19-07-02_17.txt
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "/home/bob/.local/lib/python3.6/site-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0]
[INFO   ] [Python      ] Interpreter at "/usr/bin/python3"
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
[INFO   ] [GL          ] OpenGL version <b'3.0 Mesa 18.0.5'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel Open Source Technology Center'>
[INFO   ] [GL          ] OpenGL renderer <b'Mesa DRI Intel(R) Haswell Mobile '>
[INFO   ] [GL          ] OpenGL parsed version: 3, 0
[INFO   ] [GL          ] Shading version <b'1.30'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Clipboard   ] Provider: gtk3(['clipboard_xclip', 'clipboard_xsel', 'clipboard_dbusklipper'] ignored)
[CRITICAL] [Cutbuffer   ] Unable to find any valuable Cutbuffer provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes
xclip - FileNotFoundError: [Errno 2] No such file or directory: 'xclip': 'xclip'
  File "/home/bob/.local/lib/python3.6/site-packages/kivy/core/__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)
  File "/home/bob/.local/lib/python3.6/site-packages/kivy/core/clipboard/clipboard_xclip.py", line 17, in <module>
    p = subprocess.Popen(['xclip', '-version'], stdout=subprocess.PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)

xsel - FileNotFoundError: [Errno 2] No such file or directory: 'xsel': 'xsel'
  File "/home/bob/.local/lib/python3.6/site-packages/kivy/core/__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)
  File "/home/bob/.local/lib/python3.6/site-packages/kivy/core/clipboard/clipboard_xsel.py", line 16, in <module>
    p = subprocess.Popen(['xsel'], stdout=subprocess.PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)

 Traceback (most recent call last):
   File "main.py", line 43, in <module>
     Hello().run()
   File "/home/bob/.local/lib/python3.6/site-packages/kivy/app.py", line 829, in run
     root = self.build()
   File "main.py", line 40, in build
     return HiGrid()
   File "main.py", line 32, in __init__
     self.submit.bind(on_press=self.submit)
   File "kivy/_event.pyx", line 419, in kivy._event.EventDispatcher.bind
 AssertionError: <kivy.uix.button.Button object at 0x7ff3e36a15f8> is not callable

Я ожидаю, что окно останется открытым, и терминал напечатает «Вы нажали кнопку!». Однако окно закрывается автоматически.

1 Ответ

0 голосов
/ 02 июля 2019

Это не работает, потому что self.submit является экземпляром виджета Button, и вы привязываетесь к нему.

Решение

Замените self.submit другим именем, например button

Фрагменты

button = Button(text="Submit", font_size=20)
button.bind(on_press=self.submit)
self.add_widget(button)
...