Kivy Screen Manager in verschachteltem Python-Code zeigt einen leeren Bildschirm anPython

Python-Programme
Guest
 Kivy Screen Manager in verschachteltem Python-Code zeigt einen leeren Bildschirm an

Post by Guest »

Ich habe eine Kivy-App erstellt, die Python verwendet, um die komplexe dynamische Layoutgenerierung zu steuern.
Ich versuche, links eine festgelegte Menüleiste zu erstellen, die den in einer Bildlaufansicht rechts angezeigten Inhalt steuert.
Ich habe dies getan, indem ich für jede Seite separate Screen-Klassen erstellt habe, die in der ScreenManager-Klasse aufgerufen werden. Anschließend habe ich die von Python generierten Layouts zu den zugehörigen Screen-Klassen in der Kivy-Datei hinzugefügt. Bitte lassen Sie mich wissen, ob es eine bessere Möglichkeit gibt, damit umzugehen.
Meine App sollte einen Begrüßungsbildschirm mit der Aufschrift „Dies ist der Begrüßungsbildschirm“ haben. Sobald Sie auf „Ply erstellen“ klicken, sollte der Bildschirm zur Seite zum Erstellen von Plys wechseln, die eine Tabelle mit Einträgen dynamisch steuert. Stattdessen wird das Menü korrekt angezeigt, aber nur eine leere Leinwand, wo die Bildlaufansicht sein sollte.
Die Python-Datei:

Code: Select all

#This file contains the graphical user interface logic of the DIS creator

from kivy.app import App
from kivy.metrics import dp

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.stacklayout import StackLayout
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.screenmanager import ScreenManager, Screen

class DISCreatormanage(App):
pass

class Menu(StackLayout):

#Menu funcitons
def start_create_ply(self):
screen_manager.current = "create_ply_screen"

class Splash(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)

#Dimensional control
self.spacing = dp(5)
self.padding = dp(10)
self.cols = 1
self.size_hint = (1, None)

label = Label(text="This is the splash screen")
self.add_widget(label)

class CreatePly(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)

#Dimensional control
self.spacing = dp(5)
self.padding = dp(10)
self.cols = 1
self.size_hint = (1, None)

#Varibales
self.constituent_name = []
self.constituent_arealweight = []
self.structural = []

#Add and remove consituents
#Header
self.add_remove_header = BoxLayout()
self.add_remove_header.size_hint = (1, None)
self.add_remove_header.height = dp(40)
label = Label(text="Add constituents to create a ply")
self.add_remove_header.add_widget(label)
self.add_widget(self.add_remove_header)

#Add remove buttons
self.add_remove_buttons = GridLayout()
self.add_remove_buttons.cols = 4
self.add_remove_buttons.size_hint = (1, None)
self.add_remove_buttons.height = dp(40)
self.add_remove_buttons.add_widget(Widget())
button = Button(text="+", size_hint=(None, None), width=dp(40), height=dp(40))
button.bind(on_press = lambda x: self.add_constituent_press())
self.add_remove_buttons.add_widget(button)
button = Button(text="-", size_hint=(None, None), width=dp(40), height=dp(40))
button.bind(on_press = lambda x: self.remove_constituent_press())
self.add_remove_buttons.add_widget(button)
self.add_remove_buttons.add_widget(Widget())
self.add_widget(self.add_remove_buttons)

#Constituent table
self.constituent_table = GridLayout()
self.constituent_table.cols = 3
self.constituent_table.size_hint_y = None
self.constituent_table.bind(minimum_height=self.constituent_table.setter('height'))

label = Label(text="Consituent name", size_hint=(0.55, None), height=dp(20))
self.constituent_table.add_widget(label)
label = Label(text="Areal weight (g/m2)", size_hint=(0.3, None), height=dp(20))
self.constituent_table.add_widget(label)
label = Label(text="Structural?", size_hint=(0.15, None), height=dp(20))
self.constituent_table.add_widget(label)

textinput = TextInput(size_hint=(0.55, None), height=dp(40))
self.constituent_name.append(textinput)
self.constituent_table.add_widget(textinput)
textinput = TextInput(size_hint=(0.3, None), height=dp(40))
self.constituent_arealweight.append(textinput)
self.constituent_table.add_widget(textinput)
toggle = ToggleButton(text="No", size_hint=(0.15, None), height=(dp(40)))
toggle.bind(state=(lambda self, x: CreatePly.structural_constituent_toggle(self, toggle)))
self.structural.append(toggle)
self.constituent_table.add_widget(toggle)
self.add_widget(self.constituent_table)

#Build ply button
self.footer = GridLayout()
self.footer.cols = 3

self.footer.size_hint = (1, None)
self.footer.height = dp(40)
self.footer.add_widget(Widget())
button = Button(text="Create ply", size_hint=(None, None), width=dp(120), height=dp(40))
button.bind(on_press = lambda x:  self.create_ply_click())
self.footer.add_widget(button)
self.footer.add_widget(Widget())
self.add_widget(self.footer)

#Create ply functions
def structural_constituent_toggle(self, toggle):
if toggle.state == "normal":
toggle.text = "No"
else:
toggle.text = "Yes"

def add_constituent_press(self):
textinput = TextInput(size_hint=(0.55, None), height=(dp(40)))
self.constituent_name.append(textinput)
self.constituent_table.add_widget(textinput)

textinput = TextInput(size_hint=(0.3, None), height=(dp(40)))
self.constituent_arealweight.append(textinput)
self.constituent_table.add_widget(textinput)

toggle = ToggleButton(text="No", size_hint=(0.15, None), height=(dp(40)))
toggle.bind(state=(lambda self, x: CreatePly.structural_constituent_toggle(self, toggle)))
self.structural.append(toggle)
self.constituent_table.add_widget(toggle)

def remove_constituent_press(self):

if len(self.constituent_name) == 1:
pass

else:
self.constituent_table.remove_widget(self.constituent_name[-1])
del self.constituent_name[-1]

self.constituent_table.remove_widget(self.constituent_arealweight[-1])
del self.constituent_arealweight[-1]

self.constituent_table.remove_widget(self.structural[-1])
del self.structural[-1]

def create_ply_click(self):
print("create ply click")

#Screen manager code
class SplashScreen(Screen):
pass

class CreaptePlyScreen(Screen):
pass

screen_manager = ScreenManager()
screen_manager.add_widget(SplashScreem(name="splash_screen"))
screen_manager.add_widget(CreaptePlyScreen(name="create_ply_screen"))

#Run loop
DISCreatormanage().run()
Die KV-Datei:

Code: Select all

#This file contains the graphical user interface elements of the DIS creator app

#This is the layout of the entire screen
MainLayout:

:
#Background colour
canvas.before:
Color:
rgba:(.3,.3,.3,1)
Rectangle:
pos: self.pos
size: self.size

padding: '10dp'
spacing: '10dp'
Menu:
FocusFrame:

#This is the layout for the menu which remains in place at all times.
:
#Background colour
canvas.before:
Color:
rgba:(0,0,0,1)
Rectangle:
pos: self.pos
size: self.size

#Dimension control
size_hint: None, 1
width: "160dp"
spacing: "2dp"
padding: "10dp"

Button:
text: "Create ply"
size_hint: 1, None
height: "40dp"
on_press:
root.start_create_ply()

#This places layouts in their respective screen classes

:
Splash:

:
CreatePly:
height: self.minimum_height

#This is the layout for the scrollable focus frame which will be changed on press of a menu button
:
canvas.before:
Color:
rgba:(0,0,0,1)
Rectangle:
pos: self.pos
size: self.size

ScreenManager:

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post