我无法用 kivy 中的屏幕替换小部件



我是kivy的初学者,我有一个fclass(Widget),我希望它是一个fclass(Screen),但是当我试图改变所有的屏幕混乱时,代码生成一些带有for循环的按钮,我希望我可以用浮动布局做同样的事情,但我希望fclass保持一个屏幕,因为我正在构建一个多屏幕应用程序。

.py文件如下:

import kivy
from kivy.uix.gridlayout import GridLayout
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget 
from kivy.uix.textinput import TextInput
from kivy.clock import Clock
from kivy.uix.image import Image
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.core.window import Window
from kivy.config import Config
from kivy.lang import Builder
from kivy.properties import StringProperty, ObjectProperty, NumericProperty,ReferenceListProperty
from kivy.graphics.texture import Texture
from kivy.core.camera import Camera
from kivy.graphics import *
import time
import os 
from pathlib import Path 
#import cv2                                         
import struct
import threading
import pickle
Builder.load_file('the.kv')

class fscreen(Widget):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.list_of_btns = []

def create(self):
self.h = self.height*0.9
for i in range(4):
self.h = self.h - self.height*0.1
self.btn = Button(text='button '+str(i), size=(self.width*0.4,self.height*0.05), pos=(self.width*0.3, self.h), on_press=self.press)
self.list_of_btns.append(self.btn)
self.add_widget(self.btn)

def press(self, instance):
print(instance.text)

def delete(self):
for btns in self.list_of_btns:
self.remove_widget(btns)

class theapp(App):
def build(self):

self.screenm = ScreenManager() 
self.fscreen = fscreen()
screen = Screen(name = "first screen")
screen.add_widget(self.fscreen)
self.screenm.add_widget(screen)

return self.screenm
if __name__ == "__main__":
theapp = theapp()                                       #
theapp.run() 

.kv文件:

<fscreen>
Button:
text: 'create'
size: root.width*0.4, root.height*0.05
pos: root.width*0.3, root.height*0.1
on_press: root.create()

Button:
text: 'delete'
size: root.width*0.4, root.height*0.05
pos: root.width*0.3, root.height*0.2
on_press: root.delete()

我怎样才能使f类成为一个屏幕类而不弄乱一切?提前谢谢你

在我看来,代码应该工作,但它没有。一个解决方案是在kvpy中使用size_hint而不是size。所以kv看起来像:

<fscreen>:
Button:
text: 'create'
size_hint: 0.4, 0.05
# size: root.width*0.4, root.height*0.05
pos: root.width*0.3, root.height*0.1
on_press: root.create()

Button:
text: 'delete'
size_hint: 0.4, 0.05
# size: root.width*0.4, root.height*0.05
pos: root.width*0.3, root.height*0.2
on_press: root.delete()

create()方法中的

def create(self):
self.h = self.height * 0.9
for i in range(4):
self.h = self.h - self.height * 0.1
self.btn = Button(text='button ' + str(i), size_hint=(0.4, 0.05),
pos=(self.width * 0.3, self.h), on_press=self.press)
self.list_of_btns.append(self.btn)
self.add_widget(self.btn)

你的sizekvpy都只是试图做size_hint无论如何。

当然,你的build()方法必须调整:

def build(self):
self.screenm = ScreenManager()
self.fscreen = fscreen(name="first screen")
self.screenm.add_widget(self.fscreen)
return self.screenm

其他注意事项:

  • 类名应该用大写。如果不这样做,将导致kv
  • 出现错误。
  • 你应该考虑使用pos_hint而不是pos来更好地调整你的应用

最新更新