【问题标题】:kivy - getting a spinner to remember its selectionkivy - 让微调器记住它的选择
【发布时间】:2015-01-22 04:13:40
【问题描述】:

我希望有人能告诉我如何让微调器在加载应用时记住它的值。

我正在考虑使用 from kivy.storage.jsonstore import JsonStore 来存储和检索用户在数据库中选择的值,这很容易。

但是经过几个小时的搜索,我找不到任何关于使微调器在加载时说出该值的文档。

例如,我的微调器中有很多项目(大约 60 个),滚动浏览需要一段时间,正如我所说,我可以记住最后选择的项目,但我不知道如何将其设为默认值。

    Spinner:
    id: stationSpinner
    text:'Select a Station'
    values: ('Reset Saved Station','Appledore','Axminster','Bampton','Barnstaple','Bere Alston','Bideford','Bovey Tracey','Braunton','Bridgwater','Brixham','Buckfastleigh','Budleigh Salterton','Burnham on Sea','Camels Head','Castle Cary','Chagford','Chard','Cheddar','Chulmleigh','Colyton','Combe Martin','Crediton','Crewkerne','Crownhill','Cullompton','Dartmouth','Dawlish','Danes Castle','Middlemoor','Exmouth','Frome','Glastonbury','Greenbank','Hartland','Hatherleigh','Holsworthy','Honiton','Ilfracombe','Ilminster','Ivybridge','Kingsbridge','Kingston','Lundy Island','Lynton','Martock','Minehead','Modbury','Moretonhampstead','Nether Stowey','Newton Abbot','North Tawton','Okehampton','Ottery St Mary','Paignton','Plympton','Plymstock','Porlock','Princetown','Salcombe','Seaton','Shepton Mallet','Sidmouth','Somerton','South Molton','Street','Taunton','Tavistock','Teignmouth','Tiverton','Topsham','Torquay','Torrington','Totnes','USAR','Wellington','Wells','Williton','Wincanton','Witheridge','Wiveliscombe','Woolacombe','Yelverton','Yeovil')
    size_hint: None, None
    size: (150, 44)
    pos_hint: {'center_x':0.5, 'y': 0.35}
    on_text: app.show_selected_value()

所以第一次加载应用时,它会显示“选择电台”。第二次加载它显示最后选择的电台。显然我已经把reset选项放进去清除db文件。

我尝试过使用

SvdStn = store.get('Stations')['Saved']
self.root.station.text = SvdStn

但它不起作用,我猜它相当简单,但由于我找不到任何关于它的文档,我无法理解它......我会继续寻找,也许会从不同的方向,也许在微调器旁边选择最后一个按钮时按钮变为可见,但如果 db 为空,则将 visible 属性设置为 false。

编辑:这是我的代码py file and logo on onedrive

欢迎任何想法

谢谢

雷夫

这是代码的相关部分:

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.storage.jsonstore import JsonStore
from os.path import join

kv = '''
<IncidentScreen>:
    canvas.before:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size

    station: stationSpinner
    Image:
        source:'DSFRSLogo.png'
        allow_stretch:True
        pos_hint: {'root.x':0.5, 'y':.2}

    Spinner:
        id: stationSpinner
        text:'Select a Station'
        values: ('Reset Saved Station','Appledore','Axminster','Bampton','Barnstaple','Bere Alston','Bideford','Bovey Tracey','Braunton','Bridgwater','Brixham','Buckfastleigh','Budleigh Salterton','Burnham on Sea','Camels Head','Castle Cary','Chagford','Chard','Cheddar','Chulmleigh','Colyton','Combe Martin','Crediton','Crewkerne','Crownhill','Cullompton','Dartmouth','Dawlish','Danes Castle','Middlemoor','Exmouth','Frome','Glastonbury','Greenbank','Hartland','Hatherleigh','Holsworthy','Honiton','Ilfracombe','Ilminster','Ivybridge','Kingsbridge','Kingston','Lundy Island','Lynton','Martock','Minehead','Modbury','Moretonhampstead','Nether Stowey','Newton Abbot','North Tawton','Okehampton','Ottery St Mary','Paignton','Plympton','Plymstock','Porlock','Princetown','Salcombe','Seaton','Shepton Mallet','Sidmouth','Somerton','South Molton','Street','Taunton','Tavistock','Teignmouth','Tiverton','Topsham','Torquay','Torrington','Totnes','USAR','Wellington','Wells','Williton','Wincanton','Witheridge','Wiveliscombe','Woolacombe','Yelverton','Yeovil')
        size_hint: None, None
        size: (150, 44)
        pos_hint: {'center_x':0.5, 'y': 0.35}
        on_text: app.show_selected_value()

'''
class IncidentScreen(FloatLayout):
    station = ObjectProperty(None)
    results = ObjectProperty(None)
    data_dir = App().user_data_dir
    store = JsonStore(join(data_dir, 'storage.json'))
    try:
        store.get('stations')['saved']
    except KeyError:
        SvdStn = ""
    else:
        SvdStn = store.get('stations')['saved']
        print(SvdStn)
        self.root.station.text = SvdStn

class DSFRSapp(App):

    def build(self):            
        Builder.load_string(kv)
        fl = IncidentScreen()
        return fl

if __name__ =="__main__":
    DSFRSapp().run()

【问题讨论】:

  • 按照您的尝试设置其文本应该可以。你能发布一个演示完整代码的最小工作示例吗?
  • 最小的工作示例?...不,哈哈,因为我不知道那是什么....有没有办法可以上传 py 文件?
  • 类 IncidentScreen(FloatLayout): station = ObjectProperty(None) results = ObjectProperty(None) data_dir = App().user_data_dir store = JsonStore(join(data_dir, 'storage.json')) 尝试: store.get('stations')['saved'] 除了 KeyError: SvdStn = "" else: SvdStn = store.get('stations')['saved'] self.root.station.text = SvdStn class DSFRSapp(App ): def build(self): Builder.load_string(kv) fl = IncidentScreen() return fl
  • 嗯,看起来很乱!我真的想上传文件还是可以通过电子邮件发送? @inclement
  • 最小的工作示例是指最小的示例(不包含用于演示问题的不必要代码)并且可以运行(代码可以运行并演示问题)。如果您想显示 .py 文件,请将其编辑到您的原始帖子中。

标签: python-3.x spinner kivy jsonstore getselection


【解决方案1】:

您提到的微调器方法工作正常,但您似乎误解了selfApp() 的使用。 self 引用类的当前实例,并作为参数提供给类方法,因此您不能在类方法之外使用它。您已尝试直接在 kivy 属性下使用它,但在这种情况下,它不包含值。您还尝试使用App(),但这会尝试创建 App 对象的实例。我会将加载和保存留在应用程序类中,并允许微调器使用其构造函数的额外参数进行初始化,如下所示:

class IncidentScreen(FloatLayout):
    station = ObjectProperty(None)
    results = ObjectProperty(None)

    def __init__(self, station, **kwargs):
        super(IncidentScreen, self).__init__(**kwargs)
        self.station.text = station

class DSFRSapp(App):

    def build(self):            
        Builder.load_string(kv)
        data_dir = self.user_data_dir
        store = JsonStore(join(data_dir, 'storage.json'))
        SvdStn = ""

        try:
            store.get('stations')['saved']
            SvdStn = store.get('stations')['saved']
        except KeyError:
            pass

        fl = IncidentScreen(SvdStn)
        return fl

您必须对show_selected_value 方法执行类似的操作。我必须禁用它才能运行代码,因为它会在 gui 显示时立即调用。总的来说,我建议你仔细看看 python 如何处理类。以后会省很多力气。如果你用谷歌搜索,有很多教程。

【讨论】:

  • 谢谢,我会像你说的那样研究教程,我正在学习 Codeacedemy 课程,当我理解到足以说明它是否有帮助时,我会提出问题。再次感谢!
猜你喜欢
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2011-04-26
相关资源
最近更新 更多