import Firebase
import Combine
class SessionStore: ObservableObject {
var didChange = PassthroughSubject<SessionStore, Never>()
@Published var session: User? {didSet {self.didChange.send(self) }}
var handle: AuthStateDidChangeListenerHandle?
func listen() {
handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
if let user = user {
self.session = User(uid: user.uid, email: user.email)
} else {
self.session = nil
}
})
}
func signUp(email: String, password: String, handler: @escaping AuthDataResultCallback) {
Auth.auth().createUser(withEmail: email, password: password, completion: handler)
}
func signIn(email: String, password: String, handler: @escaping AuthDataResultCallback) {
Auth.auth().signIn(withEmail: email, password: password, completion: handler)
}
func signOut() {
do {
try Auth.auth().signOut()
self.session = nil
} catch {
print("Error signing out")
}
}
func unbind() {
if let handle = handle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
deinit {
unbind()
}
}
struct User {
var uid: String
var email: String?
init(uid: String, email: String?) {
self.uid = uid
self.email = email
}
}
```
窗口和画布先前已经创建并且可以正常工作。 有人可以告诉我为什么我运行该程序时窗口什么都没显示吗? 谢谢
答案 0 :(得分:1)
您似乎没有在按钮实例上调用Buttons.display_button
方法。除非您这样做,否则您什么也看不到。
从编写代码的方式来看,canvas
似乎是全局tk.Canvas
对象。每当您调用Buttons.display_button
时,您也会同时调用canvas.place
,这是canvas.pack
的替代方法-确定要执行此操作吗?因为,这似乎不正确。
我将从更简单的东西(可行的东西)开始,然后从那里开始。还有其他一些建议:我不认为Buttons
是该类的好名字,因为该类的实例应该代表一个按钮-我认为Button
是一个更好的名字。 / p>
此外,方法名称display_button
有点多余。我们已经知道,该方法由于是Button
类的一部分而“显示”按钮-我将其称为display
或render
之类。
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
canvas.pack()
class Button:
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
def render(self):
canvas.create_oval(*self.args, **self.kwargs)
button = Button(50, 50, 150, 150, fill="grey")
button.render()
root.mainloop()