Kivy:我想在点击时通过另一个小部件(例如按钮)来改变小部件的属性(例如文本)

时间:2016-12-20 11:12:35

标签: python kivy

我对Kivy完全不熟悉,并希望将屏幕管理员从一个屏幕转换到另一个屏幕。我无法弄清楚如何在按钮的on_press方法中访问screenmanager的属性。

到目前为止,这是我的代码:

Imports System.Data.OleDb
Module modConnection

    Public cn As New OleDb.OleDbConnection
    Public cm As New OleDb.OleDbCommand
    Public dr As OleDbDataReader

    Public Sub connection()
        cn = New OleDb.OleDbConnection
        With cn
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "C:\Users\user\Documents\Visual Studio 2015\Projects\Employee Management System\ems.accdb"
            .Open()
        End With
    End Sub
End Module
Public Class Form2
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim msg As String
        msg = MsgBox("Are you sure ?", MsgBoxStyle.YesNo)
        If msg = vbYes Then
            Me.Hide()
            Login.Show()
        Else
        End If

    End Sub

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call connection()

        ComboBox1.Items.Add("Public relations")
        ComboBox1.Items.Add("Leagal")
        ComboBox1.Items.Add("Marketing")
        ComboBox1.Items.Add("Finance")
        ComboBox1.Items.Add("Administration")
        ComboBox1.Items.Add("Information Technology")
        ComboBox1.Items.Add("Production")

        ComboBox2.Items.Add("Male")
        ComboBox2.Items.Add("Female")

        ComboBox3.Items.Add("")

        ComboBox4.Items.Add("Islam")
        ComboBox4.Items.Add("Christian")
        ComboBox4.Items.Add("Hindu")

        ComboBox5.Items.Add("Production")
        ComboBox5.Items.Add("Public relations")
        ComboBox5.Items.Add("Leagal")
        ComboBox5.Items.Add("Marketing")
        ComboBox5.Items.Add("Finance")
        ComboBox5.Items.Add("Administration")
        ComboBox5.Items.Add("Information Technology")

        ComboBox7.Items.Add("Production")
        ComboBox7.Items.Add("Public relations")
        ComboBox7.Items.Add("Leagal")
        ComboBox7.Items.Add("Marketing")
        ComboBox7.Items.Add("Finance")
        ComboBox7.Items.Add("Administration")
        ComboBox7.Items.Add("Information Technology")


    End Sub
    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click
        Try

            cm = New OleDb.OleDbCommand
            With cm
                .Connection = cn
                .CommandType = CommandType.Text
                .CommandText = "INSERT INTO employee (First Name,Midle Name,Last Name) VALUES (@First Name,@Midle Nam,@Last Name)"

                '.Parameters.Add(New System.Data.OleDb.OleDbParameter("@Snum", System.Data.OleDb.OleDbType.VarChar, 255, Me.txtSearch.Text))
                .Parameters.Add(New System.Data.OleDb.OleDbParameter("@First Name", System.Data.OleDb.OleDbType.VarChar, 255, Me.TextBox2.Text))
                .Parameters.Add(New System.Data.OleDb.OleDbParameter("@Midle Name", System.Data.OleDb.OleDbType.VarChar, 255, Me.TextBox3.Text))
                .Parameters.Add(New System.Data.OleDb.OleDbParameter("@Last Name", System.Data.OleDb.OleDbType.VarChar, 255, Me.TextBox4.Text))


                ' RUN THE COMMAND
                'cm.Parameters("@Snum").Value = Me.txtSearch.Text
                cm.Parameters("@First Name").Value = Me.TextBox2.Text
                cm.Parameters("@Midle Name").Value = Me.TextBox3.Text
                cm.Parameters("@Last Name").Value = Me.TextBox4.Text


                cm.ExecuteNonQuery()
                MsgBox("Record saved.", MsgBoxStyle.Information)
                Me.TextBox2.Text = ""
                Me.TextBox3.Text = ""
                'Me.txtSearch.Text = ""
                Me.TextBox4.Text = ""
                Exit Sub
            End With
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
End Class

据我所知,这段代码不起作用,因为sm没有在按钮的方法中定义。但是,如何在按钮的类定义中访问特定小部件?或者有没有一种更优雅的方式来设置小部件之间的通信,以通过彼此改变他们的条件?

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

在您的示例中执行此操作的一种方法是使sm全局:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.button import Button
from kivy.uix.label import Label

class ScreenButton(Button):
    def __init__(self):
        super(ScreenButton, self).__init__()
        self.text = "Press Me!"

    def on_press(self, *args):
        sm.current = 'secondscreen'


sm = ScreenManager()


class MainApp(App):
    def build(self):
        sm.transition = FadeTransition()

        sc1 = Screen(name='firstscreen')
        sc1.add_widget(ScreenButton())

        sc2 = Screen(name='secondscreen')
        sc2.add_widget(Label(text='Another screen!'))

        sm.add_widget(sc1)
        sm.add_widget(sc2)

        return sm

MainApp().run()

答案 1 :(得分:0)

您也可以将sm(ScreenManager)作为kwarg传递(参见###)。这样,您可以重用ScreenButton,而不必使用全局。

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.button import Button
from kivy.uix.label import Label

class ScreenButton(Button):

   def __init__(self, **kwargs): ###
       super(ScreenButton, self).__init__()

       self.manager = kwargs.pop('manager', None) ### 
       self.text = "Press Me!"

   def on_press(self, *args):

       self.manager.current = 'secondscreen' ###


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

        sm = ScreenManager()

        sm.transition = FadeTransition()

        sc1 = Screen(name='firstscreen')
        sc1.add_widget(ScreenButton(manager=sm)) ###

        sc2 = Screen(name='secondscreen')
        sc2.add_widget(Label(text='Another screen!'))

        sm.add_widget(sc1)
        sm.add_widget(sc2)

        return sm

MainApp().run()

答案 2 :(得分:0)

好的,我有一个完全不同的解决方案,它需要更少的努力。您将需要2个文件,main.py和screens.kv

这是main.py:

import kivy
kivy.require('1.10.0')
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout

class Manager(ScreenManager):
    pass

class FirstScreen(Screen):
    pass

class SecondScreen(Screen):
    pass

class ScreensApp(App):
    def build(self):
        return Manager()

if __name__ == '__main__':
    ScreensApp().run()

import kivy kivy.require('1.10.0') from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition from kivy.uix.button import Button from kivy.uix.label import Label from kivy.uix.gridlayout import GridLayout class Manager(ScreenManager): pass class FirstScreen(Screen): pass class SecondScreen(Screen): pass class ScreensApp(App): def build(self): return Manager() if __name__ == '__main__': ScreensApp().run()

和screens.kv:

#: import sm kivy.uix.screenmanager

<Manager>
    transition: sm.FadeTransition()
    FirstScreen:
    SecondScreen:

<FirstScreen>
    name: 'First'
    GridLayout:
        Label:
            text: "First Screen"
        Button:
            text: "Press Me!"
            on_release: app.root.current = 'Second'

<SecondScreen>
    name: 'Second'
    GridLayout:
        Label:
            text: "Second Screen"
        Button:
            text: "Press Here!"
            on_release: app.root.current = 'First'

希望这有助于。