为什么我不能从不同模块中的类调用此变量?

时间:2017-01-03 06:31:10

标签: python class user-interface tkinter global

我有这个Tkinter的东西用Python 3.5。我正在尝试将一个入口盒的内容传递给另一个模块,以便我可以用它做其他事情。我正在制作像这样的Tkinter窗口:

import tkinter as tk

class GUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        tk.Label(self,text="Testers Name").grid()
        self.testers_name = tk.Entry(self,text="Testers Name").grid()
        tk.Label(self,text="Report Name").grid()
        self.report_name = tk.Entry(self,text="Report Name").grid()
        submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
        submitButton.grid()

    def query_checkbuttons(self):
       some_stuff_blah_blah_blah            


if __name__ == "__main__":

    gui = GUI()
    print(gui.report_name)
    gui.mainloop()

所以,这很好用。至少print__main__次来电报None,而不是错误。

我有另一个名为pdf.py的模块,当我尝试像这样引入report_name时,其中有一个调用失败:

def myFirstPage(canvas, doc):
    import gui 
    print(gui.report_name)
    canvas.saveState()
    canvas.setFont('Times-Bold',16)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
    canvas.restoreState()

我已经尝试了我能想到的一切。我们来看看,怎么样:

print(gui.gui.report_name)
print(gui.report_name)
print(gui.report_name.get())
print(gui.GUI.report_name)
print(gui.GUI().report_name)
print(gui.GUI().report_name.get())

我在gui电话中进行了全局__main__

我在pdf.py中的各个地方都这样做了:

import gui
from gui import *
from gui import gui
from gui import GUI

结合最后一批电话的排列......没有任何作用。

我可以在自己的模块中打印它,但我不能让它在那里出现。我该怎么做?

2 个答案:

答案 0 :(得分:2)

不完全确定,但我猜您的问题与以下行有关

public class OrderViewListAdapter extends ArrayAdapter<OrderItemList> {

public OrderViewListAdapter(Context context, int resource) {
    super(context, resource);
}

private class ViewHolder {
    TextView sku_desc;
    TextView uom_desc;
    EditText order_qty;
    ImageButton plus;
    ImageButton minus;
    AutoCompleteTextView uom;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // Get the data item for this position
    OrderItemList vehicleTransit = mDataSet.get(position);
    //System.out.println("kamal123" +mDataSet.get(position).getOrderID());
    System.out.println("kamal123" +position);
    ViewHolder viewHolder;

    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.list_item_selector, parent, false);
        viewHolder.sku_desc = (TextView) convertView.findViewById(R.id
                .item_name);
        viewHolder.uom_desc = (TextView) convertView.findViewById(R.id
                .uom_desc);
        viewHolder.order_qty = (EditText) convertView.findViewById(R.id.number_of_item);
        viewHolder.plus= (ImageButton)convertView.findViewById(R.id.button_plus) ;
        viewHolder.minus= (ImageButton)convertView.findViewById(R.id.button_minus) ;
        convertView.setTag(viewHolder);
        viewHolder.plus.setTag(viewHolder);
        viewHolder.minus.setTag(viewHolder);
        viewHolder.order_qty.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if(vehicleTransit!= null) {
        System.out.println("kamal123" + vehicleTransit.getExpectedDeliveryDate()
                .toString());


        if (vehicleTransit.getExpectedDeliveryDate() != null) {
            viewHolder.uom_desc.setText(vehicleTransit.getUOMDesc()
                    .toString());
            System.out.println("kamal123" +vehicleTransit.getExpectedDeliveryDate()
                    .toString());

        }if (vehicleTransit.getSkuDesc() != null) {
            viewHolder.sku_desc.setText(vehicleTransit.getSkuDesc().toString());
        }
            viewHolder.order_qty.setText(vehicleTransit.getOrderQty()+"");
            viewHolder.order_qty.setId(position);
    }



    viewHolder.plus.setOnClickListener(new View.OnClickListener() {


        int count=0;

        @Override
        public void onClick(View v) {
            View p = (View) v.getParent();
            ViewHolder holder1 = (ViewHolder) v.getTag();
            count = Integer.valueOf(holder1.order_qty.getText().toString());
            count++;
            holder1.order_qty.setText(String.valueOf(count));
            mDataSet.get(position).setOrderQty(count);
            //mAdapter.notifyDataSetChanged();
        }

    });



    viewHolder.minus.setOnClickListener(new View.OnClickListener() {


        int count=0;

        @Override
        public void onClick(View v) {
            View p = (View) v.getParent();
            ViewHolder holder1 = (ViewHolder) v.getTag();
            count = Integer.valueOf(holder1.order_qty.getText().toString());
            count--;
            if(count>=0)
            {holder1.order_qty.setText(String.valueOf(count));
            mDataSet.get(position).setOrderQty(count);
            //mAdapter.notifyDataSetChanged();
            }

        }

    });





    //we need to update adapter once we finish with editing
    viewHolder.order_qty.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        int count=0;
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus){
                View p = (View) v.getParent();
                ViewHolder holder1 = (ViewHolder) v.getTag();
                final int position = holder1.order_qty.getId();
                count = Integer.valueOf(holder1.order_qty.getText().toString());
                if(count>0)
                {holder1.order_qty.setText(String.valueOf(count));
                    mDataSet.get(position).setOrderQty(count);
                    //mAdapter.notifyDataSetChanged();
                }





            }
        }
    });


    /*viewHolder.order_qty.addTextChangedListener(new TextWatcher() {

        int count=0;

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            count = Integer.valueOf(s.toString());
            mDataSet.get(position).setOrderQty(count);

        }
    });*/


    return convertView;
}

@Override
public int getCount() {
    return mDataSet.size();
}
}

意味着您的类if __name__ == "__main__": 未被实例化,如[0]中所示。移动GUI类的创建,即使用以下代码段

GUI

至少允许您从该模块导入变量import tkinter as tk class GUI(tk.Tk): def __init__(self): tk.Tk.__init__(self) tk.Label(self,text="Testers Name").grid() self.testers_name = tk.Entry(self,text="Testers Name").grid() tk.Label(self,text="Report Name").grid() self.report_name = tk.Entry(self,text="Report Name").grid() submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons) submitButton.grid() def query_checkbuttons(self): some_stuff_blah_blah_blah gui = GUI() print(gui.report_name) gui.mainloop()

但是,我强烈建议不要在模块末尾实例化类,因为每次导入该模块时都会重新实例化它!

<强> EDIT1:

我会这样做:

gui

thiscode.py

然后在import tkinter as tk class GUI(tk.Tk): def __init__(self): tk.Tk.__init__(self) tk.Label(self,text="Testers Name").grid() self.testers_name = tk.Entry(self,text="Testers Name").grid() tk.Label(self,text="Report Name").grid() self.report_name = tk.Entry(self,text="Report Name").grid() submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons) submitButton.grid() def query_checkbuttons(self): some_stuff_blah_blah_blah def start_gui(): gui = GUI() # print(gui.report_name) gui.mainloop() if __name__ == "__main__": start_gui()

pdf.py

现在让我澄清一下,当您通过def myFirstPage(canvas, doc): import gui gui.start_gui() # --> manually open up the gui after import <-- # print(gui.report_name) canvas.saveState() canvas.setFont('Times-Bold',16) canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title) canvas.setFont('Times-Roman',9) canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo) canvas.restoreState() 致电thiscode.py时,您最终会打开一个GUI。但是,如果您导入模块就不是这种情况,如python thiscode.py中所示。因此,我们通过函数调用直接实例化一个GUI对象,这必须手动完成(参见第3行,pdf.py中有明确无误的内联注释)。

[0] https://docs.python.org/3/tutorial/modules.html#executing-modules-as-scripts

答案 1 :(得分:1)

public void enqueue(String item) { Node newNode = new Node(); newNode.item = item; if(isEmpty()){ first = newNode; last = newNode; return; } this.last.next = newNode; this.last = newNode; } 块的重点是仅在直接运行该文件时执行其内容,而不是在导入时执行。因此,如果您执行想要导入Node oldlast = new Node(); oldlast.item = String(last.item); 实例,则不应在该块中创建它。