python - kivy 的 Spinner 没有打开
问题描述
我正在做一个项目,但无法从 kivy 打开微调器小部件。我在网上找不到任何答案,所以我来到这里:)
我尝试使用网格布局的浮动布局,但它也不起作用。使用 kivy==1.11.1(在 2.0.0rc1 和 1.11.0 中都不起作用)
用户界面.py
import kivy
kivy.require('1.11.1')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.button import Button
from kivy.core.window import Window
Window.clearcolor = (1, 1, 1, 1)
from tkinter import Tk
from tkinter.filedialog import askopenfilename
class CustRedButton(Button):
pass
class MainScreen(Screen):
def OpenData(self):
Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
dir = askopenfilename(title='Open File', filetypes=(('CSV files', '*.csv'),))
if dir:
self.DataFileDir=dir
def toSettings(self):
try:
if self.DataFileDir:
pass
self.manager.current = 'settings'
except Exception as e:
if isinstance(e, AttributeError):
print('Got No Data')
self.manager.current = 'settings'
else:
print(e)
class SettingsScreen(Screen):
def __init__(self, **kwargs):
super(SettingsScreen, self).__init__(**kwargs)
self.spinner_values = ('House', 'Home', 'Car', 'Kivy')
def toMain(self):
try:
self.manager.current = 'main'
except Exception as e:
print(e)
def on_spinner_select(self, text):
print(text)
class ScreenManagment(ScreenManager):
main_screen= ObjectProperty(None)
settings_screen= ObjectProperty(None)
presentation= Builder.load_file('main.kv')
class MainApp(App):
def build(self):
return presentation
def runUI():
MainApp().run()
if __name__ == '__main__':
runUI()
和main.kv:
#: import NoTransition kivy.uix.screenmanager.NoTransition
<Button>:
font_size: root.width*0.1
size_hint: 0.2,0.17
color: 0,0,0,1
background_normal: ''
background_color: 0.8,0.8,0.8,1
<CustRedButton>:
font_size: root.width*0.19
size_hint: 0.1,0.1
color: 0,0,0,1
background_normal: ''
background_color: 1,0.1,0.1,1
<Label>:
color: 0,0,0,1
ScreenManagment:
id: screen_manager
main_screen: main_screen
settngs_screen: settings_screen
transition: NoTransition()
MainScreen:
name: 'main'
id: main_screen
manager: screen_manager
SettingsScreen:
name: 'settings'
id: settings_screen
manager: screen_manager
<MainScreen>:
BoxLayout:
orientation:'horizontal'
FloatLayout:
Button:
pos_hint: {'x':0.55,'top':0.6}
on_press: root.toSettings()
text: 'Go To Settings'
Button:
pos_hint: {'x':0.25,'top':0.6}
text: 'Open Data'
on_release: root.OpenData()
<SettingsScreen>:
BoxLayout:
orientation:'horizontal'
FloatLayout:
CustRedButton:
pos_hint:{'x':0, 'y':0}
on_press: root.toMain()
text: 'To Main'
GridLayout:
cols:2
pos_hint: {'x':-0.1, 'y':0.6}
size_hint: 1, 0.2
Label:
text:"Select"
Spinner:
pos_hint: {'center': (.7, .7)}
text: root.spinner_values[0]
values: root.spinner_values
on_text: root.on_spinner_select(text)
background_color: 0.5,0.5,0.5,1
所有其他小部件都可以正常工作,并且微调器从 __ init __ 很好地获取“微调器值”我实际上不知道为什么我可以看到微调器但不能打开它来选择一个值。
ps 我是 StackOverflow 的新手,所以如果我没有提供足够的信息,请告诉我,我会添加它
解决方案
问题是您的<Button>:
规则被应用于 ALL ,Buttons
包括Buttons
. Spinner
将该规则更改为MyButton@Button>
并将其用于两者Buttons
,让Spinner
工作。这是您kv
文件的修改版本,我认为它可以满足您的要求:
#: import NoTransition kivy.uix.screenmanager.NoTransition
<MyButton@Button>:
font_size: root.width*0.1
size_hint: 0.2,0.17
color: 0,0,0,1
background_normal: ''
background_color: 0.8,0.8,0.8,1
<CustRedButton>:
font_size: root.width*0.19
size_hint: 0.1,0.1
color: 0,0,0,1
background_normal: ''
background_color: 1,0.1,0.1,1
<Label>:
color: 0,0,0,1
ScreenManagment:
id: screen_manager
main_screen: main_screen
settngs_screen: settings_screen
transition: NoTransition()
MainScreen:
name: 'main'
id: main_screen
manager: screen_manager
SettingsScreen:
name: 'settings'
id: settings_screen
manager: screen_manager
<MainScreen>:
BoxLayout:
orientation:'horizontal'
FloatLayout:
MyButton:
pos_hint: {'x':0.55,'top':0.6}
on_press: root.toSettings()
text: 'Go To Settings'
MyButton:
pos_hint: {'x':0.25,'top':0.6}
text: 'Open Data'
on_release: root.OpenData()
<SettingsScreen>:
BoxLayout:
orientation:'horizontal'
FloatLayout:
CustRedButton:
pos_hint:{'x':0, 'y':0}
on_press: root.toMain()
text: 'To Main'
GridLayout:
cols:2
pos_hint: {'x':-0.1, 'y':0.6}
size_hint: 1, 0.2
Label:
text:"Select"
Spinner:
pos_hint: {'center': (.7, .7)}
text: root.spinner_values[0]
values: root.spinner_values
on_text: root.on_spinner_select(text)
background_color: 0.5,0.5,0.5,1
推荐阅读
- mongoengine - 将新字段添加到子文档后无法保存文档。使用 EmbeddedDocumentListField 引用
- typescript - 如何制作一个可以接受多个参数的回调函数
- c# - 延迟重新启动应用程序
- javascript - 如何在 Javascript 中将 2015-03-25T12:00:00Z 日期格式转换为 Mar 25 2015 12:00:00?
- laravel - 雄辩的 setTable() 后关系不起作用
- python - 如何从远程文件创建图形?
- python-3.x - matplotlib.cm.coolwarm(用于 Google 的 Colaboratory TensorFlow 教程)是 Eclipse 中的未定义变量
- python - 如何根据另一列中的值是否包含在另一个数据框的特定列中来设置一个数据框的列值
- python - python将classB中的方法作为参数传递给classA,然后从传递的classB方法中调用classA中的方法
- laravel - laravel 5.4 HTTP ERROR 500 无法处理此请求