【问题标题】:How can I make the label text change in kivy?如何在 kivy 中更改标签文本?
【发布时间】:2020-12-23 18:56:02
【问题描述】:

我正在尝试编写一个简单的预算应用程序,但在实际程序中显示变量时遇到了一些困难。同样在成功更改存款字典中的新总预算金额后(通过 EditMenu 类的 submit_total_change 方法中的那个小字(存款['total'])行确认),在重新启动之前它不会显示在应用程序上程序。

有人知道如何解决这个问题吗? 我也愿意接受任何改进建议,我几天前才开始编程。 提前非常感谢!!!

test.py

#other imports
import numpy as np
from looking import *
import threading
import time

#kivy imports
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
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.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.clock import Clock

#useful function for later
def save_list():
    np.save("budget_list.npy", budget)
    print("Saved budget list changes")

def save_list2():
    np.save("deposit.npy", deposit)
    print("Saved deposit changes")



    
#budget dictionaries
budget = dict()
deposit = dict()

#load budget
def load_budget():
    global budget
    loading = np.load("budget_list.npy", allow_pickle='True').item()
    budget = loading
    
load_budget()


#load deposit
def load_deposit():
    global deposit
    loading2 = np.load("deposit.npy", allow_pickle='True').item()
    deposit = loading2
    for k in deposit: print(k, deposit[k])

load_deposit()

#useful variables
tdeposit_money = deposit['total']
tspend_money = looking(budget).allprice()
totalmoney = tdeposit_money - tspend_money

#class to handle the main menu
class MainMenu():

    def __init__(self, **kwargs):
        pass

    def print_deposit_total(self):

        self.total_deposit = deposit['total']

        return str(self.total_deposit)

    def print_total_money(self):

        self.total_money = totalmoney

        return str(self.total_money)
    
    def exitt(self):
        quit()

    


#class to handle edit money menu
class EditMenu():

    def __init__(self, **kwargs):
        pass
    
    def display_money_left_cat (self):

        self.deposit = deposit
        self.display = str()

        for k in self.deposit:
            if k != 'total':
                print("Category:", k)
                print("Assigned Money:", self.deposit[k])
                self.display += "Category: "+str(k)+" Assigned Money: "+str(self.deposit[k])+" Money left: "+ str(deposit[k] - looking(budget).price_category(k))+"\n"

        return str(self.display)

    def display_total_money_deposit(self):
        self.deposit_total = deposit['total']

        return str(self.deposit_total)


    def submit_total_change(self):

        deposit['total'] = int(self.ids.new_total.text)
        self.ids.new_total.text = ""
        save_list2()

        #self.ids.lbl2.text = "Total money in deposit: "+ str(deposit['total'])
        #self.ids.lbl3.text = "Total money left: "+ str(totalmoney)
        print(deposit['total'])
        #self.ids.lbl1_1.text = "Total money in deeposit: "+ str(deposit['total'])
        #self.ids.lbl1_1.text = "Current total money in deposit: "+ str(deposit['total'])
        

                
                
#MainMenu Screen
class MainScreen(Screen, GridLayout, MainMenu):
    
    #for screen update
    def routine(self): 
     self.parent.current = 'menu' 
     threading.Thread(target=self.manager.get_screen('menu').build).start()


#Edit Money Menu Screen
class EditMoney(Screen, GridLayout,MainMenu, EditMenu):
    pass

class EditMoney_Amount_T(Screen, GridLayout, EditMenu):
    pass

class EditMoney_Amount_C(Screen, GridLayout, EditMenu):
    pass


#Add List Menu Screen
class AddList(Screen, GridLayout):
    pass

class EditList(Screen, GridLayout):
    pass

    
        
class MyMainApp(App):
    def build(self):
        
        sm = ScreenManager()
        #MainMenu Screen
        sm.add_widget(MainScreen(name='menu'))

        #Edit Money Menu Screen
        sm.add_widget(EditMoney(name='edit_m'))
        sm.add_widget(EditMoney_Amount_T(name='edit_m_a_t'))
        sm.add_widget(EditMoney_Amount_C(name='edit_m_a_c'))

        #Add List Menu Screen
        sm.add_widget(AddList(name='add_b'))

        #Edit List Menu Screen
        sm.add_widget(EditList(name='edit_b'))
        
        return sm

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

mymain.kv

<MainScreen>:   
    GridLayout:
        cols: 1
        size: root.width, root.height
        
        Label:
            id: lbl1
            text: "BUDGET APP"
            font_size: 50
            
        Label:
            id: lbl2
            text: "Total money in deposit: "+ root.print_deposit_total()
            font_size: 30
            
        Label:
            id: lbl3
            text: "Total money left: "+ root.print_total_money()
            font_size: 30
        
        GridLayout:
            cols: 3
            
            Button:
                id: b1
                text: "Add/Edit your available money"
                on_press: 
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'edit_m'
                
            Button:
                id: b2
                text: "Add new item to the budget list"
                on_press: 
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'add_b'
                
            Button:
                id: b3
                text: "Edit items in budget list"
                on_press: 
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'edit_b'
                
        Button:
            id: b4
            text: "Exit"
            font_size: 40
            on_press: root.exitt()
    
    
<EditMoney>:    
    GridLayout:
        cols: 1
        
        size: 50, 50
        
        Label:
            id: lbl1_1
            text: "Total money in deposit: "+ root.display_total_money_deposit()
            font_size: 30
            pos: 0, 1
            
        Label:
            id: lbl1_2 
            text: "Category:"
            font_size: 30
            
        GridLayout:
            cols: 2
            
            Button:
                id: b1_1
                text: "Change total available money"
                on_press:
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'edit_m_a_t'
                    
            Button:
                id: b1_2
                text: "Change money assinged to category"
                on_press:
                    root.manager.transition.direction = 'left'
                    root.manager.current =  'edit_m_a_c'
            
        Button:
            id: b1_1
            text: "Back to main menu"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'menu'
                
<EditMoney_Amount_T>:
    new_total: new_total
    
    GridLayout:
        cols: 1
        
        Label:
            id: lbl1_3
            text: "Current assigned total money: "+ root.display_total_money_deposit()
        
        GridLayout:
            cols: 2
            
            Label:
                id: lbl1_4
                text: "New amount: "
                
            TextInput:
                id: new_total
                multiline: False
                
        Button:
            id: b1_1_3
            text: "Submit"
            on_press: 
                root.submit_total_change()
                root.manager.transition.direction = 'right'
                root.manager.current = 'edit_m'
                
        Button:
            id: b1_1_4
            text: "Back"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'edit_m'
                
<EditMoney_Amount_C>:
    GridLayout:
        cols: 1

        
        size: 50, 50
        
        Label:
            id: lbl1_2_1
            text: root.display_money_left_cat()
            font_size: 30
            
        Button:
            id: b1_2_1
            text: "Change"
            on_press: root.display_money_left_cat()
                    
        Button:
            id: b1_2_2
            text: "Back"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'edit_m'



<AddList>:
    GridLayout:
        cols: 1
        
        size: 50, 50
        
        Label:
            text: "Add items to the budget list"
            font_size: 100
            
        Button:
            id: b2_1
            text: "Back to main menu"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'menu'

<EditList>:
    GridLayout:
        cols: 1
        
        size: 50, 50
        
        Label:
            text: "Edit budget list"
            font_size: 100
            
        Button:
            id: b3_1
            text: "Back to main menu"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'menu'

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    您在submit_total_change() 方法中的注释代码:

        #self.ids.lbl2.text = "Total money in deposit: "+ str(deposit['total'])
        #self.ids.lbl3.text = "Total money left: "+ str(totalmoney)
        print(deposit['total'])
        #self.ids.lbl1_1.text = "Total money in deeposit: "+ str(deposit['total'])
        #self.ids.lbl1_1.text = "Current total money in deposit: "+ str(deposit['total'])
    

    正在尝试引用未在包含类 (self) 中定义的 ids。似乎那些ids 是在MainScreenEditMoney 类中定义的。由于kv 中的ids 仅在作为规则根的类中定义,因此ids 仅在MainScreenEditMoney 类中可用。

    您应该能够通过访问这些类实例并通过这些类实例引用ids 来引用它们,如下所示:

    def submit_total_change(self):
    
        deposit['total'] = int(self.ids.new_total.text)
        self.ids.new_total.text = ""
        save_list2()
    
        print(deposit['total'])
    
        # get a reference to the ScreenManager
        sm = App.get_running_app().root
    
        # Get references to the screens that contain the ids of interest
        mainscreen = sm.get_screen('menu')
        editmoney = sm.get_screen('edit_m')
    
        # Now change the Label texts
        mainscreen.ids.lbl2.text = "Total money in deposit: "+ str(deposit['total'])
        mainscreen.ids.lbl3.text = "Total money left: "+ str(totalmoney)
        editmoney.ids.lbl1_1.text = "Total money in deeposit: "+ str(deposit['total'])
        
    

    【讨论】:

    • 是的,行得通!你的解释真的帮了我很多!谢谢!!!!
    【解决方案2】:

    代替self.ids. . .试试self.root.ids. . .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2018-10-06
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多