我有一个示例代码,它的工作很好。但在这段代码中,滚动视图和网格布局是在KV文件中创建的。我有一个滚动错误的问题,所以我想在纯Python中创建它们。
有350个boxlayout,它们是在Scrollview中创建的,每个boxlayout有5个小部件(按钮标签等),所以这会导致Scrollview在清除屏幕和重新创建结果时出现一些错误。80个boxlayout没有问题,但它们是动态创建的,有时Scrollview中会有300多个boxlayout。
我想如果我可以创建滚动视图和网格布局,我可以解决这个问题。所以我需要你的帮助。
我怎么能做到这一点.测试代码:
- PY文件:**
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.metrics import dp
from kivy.uix.behaviors import ButtonBehavior
from kivy.clock import Clock, mainthread
import json
import threading
class Test(BoxLayout):
def __init__(self, **kwargs):
super(Test, self).__init__(**kwargs)
self.data = self.datas()
# Homepage Screen
def homepage(self, screenmanager):
screenmanager.current = 'homepage_screen'
Clock.schedule_once(self.clear_widgets)
# Clear Widgets
def clear_widgets(self, *args):
for child in [child for child in self.ids.gridsonuc.children]:
self.ids.gridsonuc.remove_widget(child)
#Second screen
def second(self,screenmanager):
screenmanager.current = 'second_screen'
Clock.schedule_once(self.clear_widgets)
Clock.schedule_once(self.datas) # Before calculation, each time app pulls data again, but Kivy Does Not Update The Refreshed Data in The Screen!
Clock.schedule_once(self.calculate)
# or, if i can use threading system as well but this time i must add @mainthread above def calculate(self, *args): to make code work.
# in both scenario, Kivy Does Not Update The Refreshed Data in The Screen While APP is Running.
# mythread1 = threading.Thread(target=self.clear_widgets)
# mythread1.start()
# mythread2 = threading.Thread(target=self.datas)
# mythread2.start()
# mythread3 = threading.Thread(target=self.calculate)
# mythread3.start()
# Calculation
#@mainthread
def calculate(self, *args):
for i in self.data['home']:
box = BoxLayout(size_hint_y = None, height = dp(50))
hometeams = Label(text = f'{[i]}', font_name = 'Roboto', font_size = dp(15), size_hint = (0.225, 1), halign='center', bold = True )
box.add_widget(hometeams)
self.ids.gridsonuc.add_widget(box)
def datas(self, *args):
# PLEASE CHANGE THE LOCATION!!!!!!!!!!!!!!!!!
with open ("C:\\Users\\Messi\\Desktop\\Python\\Projects\\Football Tips\\Kivy\\Testing Bugs\\Test1\\data.json", "r") as dosya:
dataApi = json.load(dosya)
print('datas updated')
self.data = dataApi # update the self.data
return dataApi
class TestApp(App):
def build(self):
return Test()
if __name__ == '__main__':
TestApp().run()
- KV文件:**
#:import NoTransition kivy.uix.screenmanager.NoTransition
<Test>:
ScreenManager:
transition: NoTransition()
id: sm
size: root.width, root.height
Screen:
name: 'homepage_screen'
BoxLayout:
size_hint: 1, 0.10
Button:
text: 'Calculate'
id: underOver_button_homepage
on_press: root.second(sm)
background_color: 0, 0, 0, 0
Screen:
name: 'second_screen'
BoxLayout:
spacing: '20dp'
orientation: 'vertical'
BoxLayout:
size_hint: 1, 0.80
ScrollView:
scroll_type: ['bars', 'content']
bar_margin: '5dp'
bar_color: 1, 0.4, 0.769, 1
bar_width: '5dp'
bar_inactive_color: 1, 0.4, 0.769, 1
GridLayout:
id: gridsonuc
cols: 1
spacing: '50dp'
size_hint_y: None
height: self.minimum_height
BoxLayout:
size_hint: 1, 0.10
Button:
text: 'Home'
id: home_button_underOver
on_press: root.homepage(sm)
background_color: 0, 0, 0, 0
- 例如:**
我不想在KV文件中使用此结构
BoxLayout:
size_hint: 1, 0.80
ScrollView:
scroll_type: ['bars', 'content']
bar_margin: '5dp'
bar_color: 1, 0.4, 0.769, 1
bar_width: '5dp'
bar_inactive_color: 1, 0.4, 0.769, 1
GridLayout:
id: gridsonuc
cols: 1
spacing: '50dp'
size_hint_y: None
height: self.minimum_height
- 我的目标:**
BoxLayout:
size_hint: 1, 0.80
Newscroll: # New Scrollview Class and have also Gridlayout in it
GridLayout和Scrollview必须有相同的设置,我想使用如下。我认为scroll_type:["条形图","内容"],条形图边距:'5dp',条颜色:1、0.4、0.769、1,条形宽度:'5dp',条_非活动_颜色:1、0.4、0.769、1列:1、间距:'50dp',大小_提示_y:无,身高:self. minimum_height应使用Python编写
还有一个新的clear def()用于清理完整的scrollview类,当在Pure Python中清除和创建Scrollview时,会动态创建,这样我就可以修复我的Scroll bug问题。
谢谢你的帮助。我希望有一天我能达到一个可以帮助其他人的水平。
1条答案
按热度按时间5sxhfpxr1#
对你的问题最简短的回答是:
你不能。
请参阅堆栈溢出中的Pure python gui library?,以读取:
“纯python gui库”的概念是错误的,因为最终您将使用系统级调用和小部件,可能是通过ctype,但这不会改变这样一个事实,即如果您开始实现您的想法,您最终将使用wxPython或其他一些模块结束。
沿着已接受答案中的声明:
最省力和最佳结果的途径是了解使用一些现有GUI库部署应用程序需要做些什么。
Kivy是一个Python模块,您可以使用它来创建GUI(图形用户界面),并且可以通过它创建的带有用户界面的窗口来创建Scrollview和Gridlayout对象/小部件。
您的目标是使用“pure Python”来替换对象/小部件,但不可能使用“pure Python”来完成此任务,因为Python需要使用GUI模块。
大多数原生GUI模块是tkinter,它是标准Python安装附带的,最接近“纯Python”的概念,但是它需要GTK已经安装在系统上,否则它将不可用,您需要学习如何正确地使用它,就像您在使用Kivy时需要它一样。
换句话说,找出使用Kivy时遇到的问题的实际原因并解决它们,而不是学习如何使用另一个GUI库来重新创建应用程序,这将是一个好主意。
如果你的想法是在Kivy中创建自己的小部件,你必须学习如何为Kivy编写自己的扩展,这比找出你在使用它时遇到问题的原因要花费你更多的精力。