我对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没有在按钮的方法中定义。但是,如何在按钮的类定义中访问特定小部件?或者有没有一种更优雅的方式来设置小部件之间的通信,以通过彼此改变他们的条件?
感谢您的帮助。
答案 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'
希望这有助于。