Python/Kivy : Call function from one class to another class and show widget in Python(Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件)
问题描述
我正在使用 Python-2.7 和 Kivy.当我运行 test.py 时,会显示一个显示按钮.当我单击显示按钮时,会显示一个标签和值.我正在从数据库中获取它,但现在我将它定义为一个静态数组.
I am using Python-2.7 and Kivy. When I run test.py then a show button shows. When I click on the show button then a label and value shows. I am fetching it from the database but now I defined it as a static array.
当我点击 Item1 标签然后调用 def open_form 并在使用 id 调用 EditPopup(self)
后传递 id 11 并显示一个带有值的弹出窗口.
When I click on Item1 label then call def open_form and pass id 11 after calling EditPopup(self)
with id and show a popup with value.
之后我更改 itemCode
并单击确定按钮,然后它会更新数据库中的数据.
After that I change itemCode
and click on the ok button then it updates data in the database.
之后我调用 Invoice().abc()
然后它在 Pycharm
控制台中打印更新的数据,但不显示 layout.add_widget 中的最新数据
(弹出窗口).
After that I call Invoice().abc()
then it prints the updated data in Pycharm
console but not showing latest the data in layout.add_widget
(Popup window).
谁能告诉我哪里出错了?
Can someone tell me where am I making a mistake?
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.core.window import Window
from functools import partial
from kivy.uix.popup import Popup
from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty
import sqlite3 as lite
#con = lite.connect('test.db')
#con.text_factory = str
#cur = con.cursor()
Window.clearcolor = (0.5, 0.5, 0.5, 1)
Window.size = (600, 600)
class MyLabel(Label):
pass
class EditPopup(Popup):
mode = StringProperty("")
label_rec_id = StringProperty("Id")
col_data = ListProperty(["?", "?", "?"])
index = NumericProperty(0)
def __init__(self, obj, **kwargs):
super(EditPopup, self).__init__(**kwargs)
if obj.mode == "Update":
#cur.execute("SELECT * FROM `item` WHERE itemId=?", (edit_id,))
#row = cur.fetchone()
row = (11, 'Item1', '1001')
print(row[0])
self.col_data[0] = str(row[0])
self.col_data[1] = row[1]
self.col_data[2] = row[2]
def update(self,obj):
#cur.execute("UPDATE `item` SET itemName=?, itemCode=? WHERE itemId=?",
#('Item1', 9999, 11))
#con.commit()
Invoice().abc()
class Invoice(Screen):
def __init__(self, **kwargs):
super(Invoice, self).__init__(**kwargs)
def abc(self):
#fetching from database
#cur.execute("SELECT * FROM `item` order by itemId asc")
#rows = cur.fetchall()
rows = [(11, 'Item1', '1001'), (12, 'Item2', '2001'), (13, 'Item3', '102')]
print(rows)
layout = self.ids['invoices']
for row in rows:
layout.add_widget(MyLabel(text=str('[ref=world]' + row[1]) + '[/ref]',
size_hint_x=.35,
halign='left',
markup=True,
on_ref_press=partial(self.open_form, row[0])))
def open_form(self, id, *args):
global edit_id
edit_id = id
self.mode = "Update"
popup = EditPopup(self)
popup.open()
class Test(App):
def build(self):
return Invoice()
if __name__ == '__main__':
Test().run()
test.kv
<Button@Button>:
font_size: 15
font_name: 'Verdana'
size_hint_y:None
height: 30
<MyLabel>:
font_size: 15
font_name: 'Verdana'
size_hint_y:None
height: 30
text_size: self.size
valign: 'middle'
canvas.before:
Color:
rgb: .6, .6, .6
Rectangle:
pos: self.pos
size: self.size
<EditPopup>:
title: self.mode + " Item"
size_hint: None, None
title_size: 20
title_font: "Verdana"
size: 400, 275
auto_dismiss: False
BoxLayout:
orientation: "vertical"
GridLayout:
cols: 2
#backgroun_color: 0, 0.517, 0.705, 1
spacing: 10, 10
padding: 20, 20
Label:
text: root.label_rec_id
text_size: self.size
Label:
id: itemId
text: root.col_data[0]
text_size: self.size
Label:
text: "Item Name"
text_size: self.size
valign: 'middle'
TextInput:
id: itemName
text: root.col_data[1]
text_size: self.size
Label:
text: "State Code"
text_size: self.size
valign: 'middle'
TextInput:
id: itemCode
text: root.col_data[2]
text_size: self.size
GridLayout:
cols: 2
padding: 10, 0, 10, 10
spacing: 10, 10
row_default_height: '20dp'
size_hint: .55, .3
pos_hint: {'x': .25, 'y':.65}
Button:
size_hint_x: .5
text: "Ok"
on_release:
root.update(root)
root.dismiss()
Button:
size_hint_x: .5
text: "Cancel"
on_release: root.dismiss()
<Invoice>:
BoxLayout:
orientation: "vertical"
padding : 15, 15
BoxLayout:
orientation: "vertical"
padding : 5, 5
size_hint: .6, None
pos_hint: {'x': .18,}
BoxLayout:
orientation: "horizontal"
padding : 5, 5
spacing: 10, 10
size: 800, 40
size_hint: 1, None
Button:
text: "Show"
size_hint_x: .05
spacing_x: 30
on_press:root.abc()
BoxLayout:
orientation: "horizontal"
size_hint: 1, 1
BoxLayout:
orientation: "vertical"
size_hint: .5, 1
padding : 0, 15
spacing: 10, 10
size: 500, 30
GridLayout:
id: invoices
cols: 2
#orientation: "horizontal"
padding : 5, 0
spacing: 10, 0
#size: 500, 30
size_hint: 1, 1
pos: self.pos
size: self.size
推荐答案
您正在创建一个新的 Invoice
实例,而不是使用现有的实例.
You are creating a new Invoice
instance instead of using the existing one.
Invoice().abc()
试试吧:
class EditPopup(Popup):
mode = StringProperty("")
label_rec_id = StringProperty("Id")
col_data = ListProperty(["?", "?", "?"])
index = NumericProperty(0)
def __init__(self, obj, **kwargs):
super(EditPopup, self).__init__(**kwargs)
self.obj = obj # will need it later...
def update(self,obj):
#cur.execute("UPDATE `item` SET itemName=?, itemCode=? WHERE itemId=?",
#('Item1', 9999, 11))
#con.commit()
self.obj.abc() # was Invoice().abc()
这篇关于Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件


基础教程推荐
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01