在這里,我使用 for 回圈制作了一個充滿輸入框的網格,并將它們添加到字典中以便以后訪問,因為我無法在 python 檔案中設定 id。現在我正在嘗試創建一個函式,該函式將根據輸入框的資料進行基本計算,但我不知道如何在不使用 id 的情況下在該函式中傳遞特定的輸入框。on_text 函式也沒有像我預期的那樣作業。我確定我在這里遺漏了一些重要的東西。任何指導表示贊賞。
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.stacklayout import StackLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.properties import StringProperty
Builder.load_file("gridtable.kv")
class MyBox(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
pass
class MyGrid(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cols=6
self.textinputs = {}
for i in range(48):
key = i 1
self.textinputs[key] = TextInput(multiline=False,font_size=dp(30),on_text=self.calc(key))
self.add_widget(self.textinputs[key])
def calc(self,key):
print(self.textinputs[key])
class MyApp(App):
def build(self):
return MyBox()
if __name__ == "__main__":
MyApp().run()
<MyBox>:
mygrid:my_grid
orientation: "vertical"
MyGrid:
id: my_grid
size_hint: 1,0.8
BoxLayout:
orientation: "horizontal"
size_hint: 1,0.2
BoxLayout:
orientation: "vertical"
Button:
text: "Expense Total:"
Button:
text: "Revenue Total:"
Button:
text: "Profit:"
font_size: 40
Traceback (most recent call last):
File "c:\Users\jaika\OneDrive\Desktop\python\lil_curry_project\gridtable.py", line 38, in <module>
MyApp().run()
print(self.textinputs[key])
KeyError: 1
#better version of MyGrid()
class MyGrid(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cols=4
self.textinputs = [0]
self.expense = 0
self.revenue = 0
self.profit = 0
for i in range(16):
t = TextInput(multiline=False,text=str(i 1))
t.bind(on_text_validate=self.calc_profit)
self.textinputs.append(t)
self.add_widget(t)
def calc_profit(self,instance):
index = self.textinputs.index(instance)
if index == 1 or index == 2 or index == 5 or index == 6 or index == 9 or index == 10 or index == 13 or index == 14:
self.expense = int(instance.text)
else:
self.revenue = int(instance.text)
self.profit = self.revenue - self.expense
print(self.profit)
uj5u.com熱心網友回復:
您可以使用bind來觸發方法呼叫,或使用TextInput(like on_text_validate) 中可用的事件。這是一個使用兩者的修改MyGrid類:
class MyGrid(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cols = 6
self.textinputs = {}
for i in range(48):
key = i 1
self.textinputs[key] = TextInput(multiline=False, font_size=dp(30), on_text_validate=self.abba)
self.textinputs[key].bind(text=partial(self.calc, key))
print('in init, key =', key)
self.add_widget(self.textinputs[key])
def abba(self, ti_instance):
print('abba, textinput instance =', ti_instance, ', text =', ti_instance.text)
def calc(self, key, ti_instance, text):
print('calc:')
print('key =', key, ', text =', text, ', textinput instance =', ti_instance)
請注意,每次更改 a 中的文本都會觸發bindto 。只會在用戶點擊時觸發。textTextInputon_text_validateEnter
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/463584.html
