Проблема с Python, не открывающим файлы в правильном порядке

#python #button #kivy

#python #кнопка #kivy

Вопрос:

Я использую Python 3.9 и Kivy

  from kivy.config import Config 
Config.set('graphics', 'resizable', False)
Config.set('graphics', 'width',  800)
Config.set('graphics', 'height', 600)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')

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
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.lang import Builder
import subprocess





presentation = Builder.load_file('UI_1.kv')

#Calling files to open 
#Always use popen 

class presentation(Widget):
    maths = ObjectProperty(None)
    physics = ObjectProperty(None)


    def btn_touch_up(maths):        
        from subprocess import Popen, PIPE
        subprocess.Popen(['python',  'UI_MATH.py'])
        exit()



    def btn_touch_up(physics):        
        from subprocess import Popen, PIPE
        subprocess.Popen(['python',  'UI_PHYSICS.py'])
        exit()




        

class MyApp(App): 
    def build(self):
        return presentation()





Window.clearcolor = (1, 1, 1, 1)




if __name__ == "__main__":
    MyApp().run()
 

Итак, это код, который я написал. Проблема в том, что когда я запускаю приложение и нажимаю на первое поле (с надписью maths), открывается код для окна 2 (физика). Когда я запускаю второй блок (физика), он запускает правильный код. Может ли кто-нибудь указать на мою ошибку, чтобы я мог ее исправить? Я довольно новичок, поэтому мой код может показаться беспорядочным…

Вот код из файла kivy (.kv):

 <presentation>

    maths : maths
    physics : physics
    extra : extra


    canvas:
        Color:
            rgb:0,0,0
        Rectangle:
            pos:8,498
            size:790,50
        
        Rectangle:
            pos:8,398
            size:790,50
        
        Rectangle:
            pos:8,298
            size:790,50

    GridLayout:

    

        cols:1
        size: root.width -10, root.height -550
        pos: 5, 500


        GridLayout:
            cols:1      
    

            Button:
                id: maths
                text:"1.Maths"
                on_press: root.btn_touch_up()
                



    
    GridLayout:
        cols:1
        size: root.width -10, root.height -550
        pos: 5, 400


        GridLayout:
            cols:1          

            Button:
                id: physics
                text:"2.Physics"
                on_press: root.btn_touch_up()



    GridLayout:
        cols:1
        size: root.width -10, root.height -550
        pos: 5, 300


        GridLayout:
            cols:1


            

            Button:
                id: extra
                text:"3.Extra"
                on_press: root.btn_touch_up()
            
 

Спасибо, и еще раз, я действительно новичок и самоучка, поэтому, если есть что-то явно неправильное, чего я не должен делать, пожалуйста, укажите на это.

Ответ №1:

Ваш код для presentation класса имеет два определения для btn_touch_up() метода. В результате второе определение перезаписывает первое, и первое определение никогда не может быть вызвано (поскольку оно больше не существует). Вам просто нужно создать уникальные имена методов, одно для математики и другое для физики.

Комментарии:

1. Не могли бы вы привести мне пример уникального имени метода, не совсем уверен, как это сделать… Спасибо!

2. Вы можете использовать btn_touch_up_math для математики и btn_touch_up_physics физики.