<h2>问题1-小部件@左下角&窗口未满?你知道吗</h2>
<blockquote>
<p>Button is placed on the corner and i am expecting its size to be full
window but it small</p>
</blockquote>
<h2>根本原因</h2>
<ol>
<li>按钮小部件出现在左下角,因为根是<a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html" rel="nofollow noreferrer">Widget</a>,没有提供位置(<a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html#kivy.uix.widget.Widget.pos" rel="nofollow noreferrer">pos</a>,或<a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html#kivy.uix.widget.Widget.pos_hint" rel="nofollow noreferrer">pos_hint</a>)。因此,使用了默认位置(0,0)。你知道吗</li>
<li><a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html#kivy.uix.widget.Widget.size" rel="nofollow noreferrer">size</a>不是完整窗口,因为默认情况下,<a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html" rel="nofollow noreferrer">Widget</a>的大小是(100x100),或者默认的<a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html#kivy.uix.widget.Widget.size_hint" rel="nofollow noreferrer">size_hint</a>是(1,1)。你知道吗</li>
</ol>
<h3><a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html" rel="nofollow noreferrer">Kivy Widget » Default values</a></h3>
<blockquote>
<ul>
<li>A <a href="https://kivy.org/doc/stable/api-kivy.uix.widget.html#kivy.uix.widget.Widget" rel="nofollow noreferrer">Widget</a> is not a <a href="https://kivy.org/doc/stable/api-kivy.uix.layout.html#kivy.uix.layout.Layout" rel="nofollow noreferrer">Layout</a>: it will not change the position or the size of its children. If you want control over positioning or
sizing, use a <a href="https://kivy.org/doc/stable/api-kivy.uix.layout.html#kivy.uix.layout.Layout" rel="nofollow noreferrer">Layout</a>.</li>
<li>The default size of a widget is (100, 100). This is only changed if the parent is a <a href="https://kivy.org/doc/stable/api-kivy.uix.layout.html#kivy.uix.layout.Layout" rel="nofollow noreferrer">Layout</a>. For example, if you add a Label inside a
Button, the label will not inherit the button’s size or position
because the button is not a Layout: it’s just another Widget.</li>
<li>The default size_hint is (1, 1). If the parent is a Layout, then the widget size will be the parent layout’s size.</li>
</ul>
</blockquote>
<h2>问题2-释放按钮屏幕未切换?你知道吗</h2>
<blockquote>
<p>On click and release the button doesnt' show any effect.</p>
</blockquote>
<h2>根本原因</h2>
<p>当按下按钮时,屏幕没有切换,因为应用程序的根不是<a href="https://kivy.org/doc/stable/api-kivy.uix.screenmanager.html#kivy.uix.screenmanager.ScreenManager" rel="nofollow noreferrer">ScreenManager</a>。你知道吗</p>
<h2>解决方案</h2>
<p>解决这些问题有两种选择。你知道吗</p>
<h2>选项1-使用布局作为根目录</h2>
<p>此选项使用<a href="https://kivy.org/doc/stable/api-kivy.uix.boxlayout.html" rel="nofollow noreferrer">BoxLayout</a>作为根,并需要以下增强。A <a href="https://kivy.org/doc/stable/api-kivy.uix.layout.html" rel="nofollow noreferrer">Layout</a>可以是<code>GridLayout</code>、<code>BoxLayout</code>、<code>FloatLayout</code>等</p>
<h3>Py文件</h3>
<ol>
<li>用BoxLayout替换小部件</li>
<li>用<code>Builder.load_file(...)</code>替换<code>present = Builder.load_file(...)</code></li>
<li>将<code>Builder.load_file(...)</code>移出<code>class ChatGUI()</code>并添加<code>pass</code></li>
</ol>
<h3>kv文件</h3>
<ol>
<li>在实例化对象下添加<code>id: sm</code>,<code>MainManager:</code></li>
<li>用<code>app.root.ids.sm.current</code>替换<code>app.root.current</code></li>
</ol>
<h3>片段-选项1</h3>
<p><strong>main1.py</strong></p>
<pre><code>from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
Builder.load_file("main1.kv")
class ChatGUI(BoxLayout):
pass
class MainWindow(Screen):
pass
class SecondWindow(Screen):
pass
class MainManager(ScreenManager):
pass
class ChatApp(App):
def build(self):
return ChatGUI()
if __name__ == "__main__":
ChatApp().run()
</code></pre>
<p><strong>main1.kv</strong></p>
<pre><code><ChatGUI>:
MainManager:
id: sm
MainWindow:
SecondWindow:
<MainWindow>:
name: "main"
Button:
text: "to second window"
on_release: app.root.ids.sm.current="second"
<SecondWindow>:
name: "second"
Button:
text: "back to main"
on_release: app.root.ids.sm.current="main"
</code></pre>
<h2>选项2-使用ScreenManager作为根目录</h2>
<p>此选项需要以下增强功能:</p>
<h3>Py文件</h3>
<ol>
<li>删除导入语句,<code>from kivy.uix.widget import Widget</code></li>
<li>删除<code>class ChatGUI()</code></li>
<li>用<code>return MainManager()</code>替换<code>return ChatGUI()</code></li>
<li>用<code>Builder.load_file(...)</code>替换<code>present = Builder.load_file(...)</code></li>
</ol>
<h3>kv文件</h3>
<ol>
<li>删除kv文件中的类规则</li>
<li>用类规则替换MainManager::</li>
</ol>
<h3>片段-选项2</h3>
<p><strong>main2.py</strong></p>
<pre><code>from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
Builder.load_file("main2.kv")
class MainWindow(Screen):
pass
class SecondWindow(Screen):
pass
class MainManager(ScreenManager):
pass
class ChatApp(App):
def build(self):
return MainManager()
if __name__ == "__main__":
ChatApp().run()
</code></pre>
<p><strong>main2.kv</strong></p>
<pre><code><MainManager>:
MainWindow:
SecondWindow:
<MainWindow>:
name: "main"
Button:
text: "to second window"
on_release: app.root.current="second"
<SecondWindow>:
name: "second"
Button:
text: "back to main"
on_release: app.root.current="main"
</code></pre>