我刚刚开始学习tkinter,当导入messagebox时,我发现我一定不能理解import语句.
令我困惑的是:
import tkinter as tk
def text_box():
if tk.messagebox.askokcancel("Quit", "Never Mind"):
root.destroy()
root = tk.Tk()
button = tk.Button(root, text="Press the button", command=text_box)
button.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
编译好,但按下按钮会出错'module' object has no attribute 'messagebox',而代码:
import tkinter as tk
from tkinter import messagebox
...
if messagebox.askokcancel("Quit", "Never Mind"):
...
Run Code Online (Sandbox Code Playgroud)
......工作顺利.
如果我导入,我会收到类似的错误from tkinter import *.
tkinter的帮助显示messagebox在列表中PACKAGE CONTENTS,但我无法以正常方式加载它.
所以我的问题是,为什么......以及我不理解的导入是什么?
我想应该提一下 - 代码只能在Python 3中运行,并且在Python 2.x messagebox中调用tkMessageBox并且没有定义tkinter.
我仍然在探索C++,试图找出它是如何工作的,并遇到了令我困惑的事情.
我有一个简单地拥有一个list<string>并且具有一些成员函数的类
class String_list {
public:
String_list(istream&);
//other functions
list<string> listing;
};
Run Code Online (Sandbox Code Playgroud)
我编写了我的构造函数来使用非成员函数
String_list::String_list(istream& in) { get_strings(in, listing); }
Run Code Online (Sandbox Code Playgroud)
同
istream& get_strings(istream& in, list<string> lstring)
{
if(in) {
lstring.clear();
string word;
while (in >> word)
lstring.push_back(word);
in.clear();
}
return in;
}
Run Code Online (Sandbox Code Playgroud)
问题是,虽然get_string函数似乎有效,但它不会更改listing我传递给它的成员变量.
我可以通过只更改为get_strings使用一个参数创建一个成员函数来使它工作,所以我假设从构造函数中传递列表由于某种原因不起作用,或者非成员函数不能改变成员变量,但这些似乎是我的编译器很容易接受的东西.(istream& in)lstringlisting
当我运行成员列表总是.size()为0 的可执行文件时,我的编译器看不到代码的任何问题.